我对Java 8静态方法引用有一些误解。
以下是正确的陈述:
Stream.of("aaa", "bbb", "cccc").map(String::length);
AFAIK map
需要Function<T, R> interface
作为参数,其方法类似于:
R apply(T t);
但是,length()
类的String
方法不接受任何参数:
public int length() {
return value.length;
}
1)它如何与需要参数apply
的{{1}}方法相关联?
2)如果我写T t
并不意味着String::someMethod
应该是静态的(因为我按类名称而不是通过对象引用来调用它)? / p>
谢谢!
答案 0 :(得分:6)
不,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>
转换为Stream<Integer>
。
答案 1 :(得分:3)
当您将lambdas /方法引用扩展为匿名内部类时,它使事情更容易理解。当您使用匿名类替换方法引用时,您的语句将转换为类似的内容:
Stream.of("aaa", "bbb", "cccc").map(new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return s.length();
}
});
正如您所看到的,input是String,它返回的字符串长度是Integer。它遵循您提到的Function
功能接口定义。