Ser*_*eiK 4 java java-8 java-stream
我对Java 8静态方法引用有一些误解.
以下是正确的陈述:
Stream.of("aaa", "bbb", "cccc").map(String::length);
Run Code Online (Sandbox Code Playgroud)
AFAIK map需要一个Function<T, R> interface类似于以下方法的参数:
R apply(T t);
Run Code Online (Sandbox Code Playgroud)
但是,类的length()方法String不接受任何参数:
public int length() {
return value.length;
}
Run Code Online (Sandbox Code Playgroud)
1)它如何与apply需要参数的方法相关联T t?
2)如果我写String::someMethod不是意味着它someMethod应该是静态的(因为我是通过类名而不是通过对象引用来调用它)?
谢谢!
不,String::someMethod并不意味着该方法必须是静态的.它可以是静态方法,也可以是在某个String实例上执行的实例方法.该实例将充当由该方法引用实现的功能接口的单个方法的隐式参数.
因此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>为a Stream<Integer>.