为何未实现Predicate的方法引用可传入Stream.anyMatch?
问题解答
这是因为Java的方法引用可以自动适配函数式接口,不需要类显式实现对应接口,只要方法签名和函数式接口的抽象方法兼容即可。
关键细节拆解:
Stream.anyMatch要求的参数是Predicate<? super T>,而Predicate是一个函数式接口——仅包含一个抽象方法boolean test(T t)。- 你的
ClassA.anyMethodName(Object o)方法:- 接收一个
Object类型参数(流中元素是String,String是Object的子类,满足Predicate<? super String>的参数要求) - 返回值是
boolean - 这个方法的签名和
Predicate的抽象方法test(T t)完全匹配。
- 接收一个
Java会自动将classA::anyMethodName这个实例方法引用,包装成一个Predicate<String>的实例,因此可以直接传入anyMatch方法,无需ClassA显式实现Predicate接口。
额外补充:你运行这段代码时,peek会依次打印所有元素(h、d、w、m、y),因为所有元素都不满足o instanceof Integer的条件,anyMatch会遍历完整个流后返回false。
内容的提问来源于stack exchange,提问作者user1169587
相关产品推荐
相关产品推荐

