我对 Java 8 静态方法引用有一些误解。
下列说法正确的是:
Stream.of("aaa", "bbb", "cccc").map(String::length);
据我所知map
需要 Function<T, R> interface
作为参数,方法类似于:
R apply(T t);
然而,length()
String
的方法|类不接受任何参数:
public int length() {
return value.length;
}
1) 它与 apply
有何关联?需要参数的方法 T t
?
2) 如果我写 String::someMethod
这不是说someMethod
吗?应该是静态的(因为我是通过类名而不是对象引用来调用它的)?
谢谢!
最佳答案
不,String::someMethod
并不意味着该方法必须是静态的。它可以是静态方法,也可以是将在某些 String
上执行的实例方法。实例。该实例将作为该方法引用实现的功能接口(interface)的单个方法的隐式参数。
因此String::length
确实有一个参数 - String
length
所在的实例方法将被调用。
String::length
等同于 lambda 表达式 (String s) -> s.length()
(或者只是 s -> s.length()
)。
当你写 Stream.of("aaa", "bbb", "cccc").map(String::length)
, length()
Stream
的每个元素都会执行方法(假设你添加了一些导致 map
在这些元素上被评估的终端操作)这将改变你的 Stream<String>
到 Stream<Integer>
.
关于Java Stream API 映射参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49936865/