Java流API映射参数
我对Java8静态方法引用有一些误解 以下是正确的陈述:Java流API映射参数,java,java-8,java-stream,Java,Java 8,Java Stream,我对Java8静态方法引用有一些误解 以下是正确的陈述: Stream.of("aaa", "bbb", "cccc").map(String::length); AFAIKmap需要一个函数接口作为参数,其方法类似于: R apply(T t); 但是,String类的length()方法不接受任何参数: public int length() { return value.length; } 1) 它与需要参数T的apply方法有何关联 2) 如果我写String::someM
Stream.of("aaa", "bbb", "cccc").map(String::length);
AFAIKmap
需要一个函数接口
作为参数,其方法类似于:
R apply(T t);
但是,String
类的length()
方法不接受任何参数:
public int length() {
return value.length;
}
1) 它与需要参数T
的apply
方法有何关联
2) 如果我写String::someMethod
,这不意味着someMethod
应该是静态的(因为我是通过类名而不是对象引用来调用它的)
谢谢大家! 当您将lambdas/方法引用扩展到匿名内部类时,它使事情更容易理解。当您用匿名类替换方法引用时,您的语句转换为如下内容:
Stream.of("aaa", "bbb", "cccc").map(new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return s.length();
}
});
Stream.of(“aaa”、“bbb”、“cccc”).map(新函数(){
@凌驾
公共整数应用(字符串s){
返回s.length();
}
});
正如您在这里看到的,输入是字符串,它返回的字符串长度是一个整数。它遵循您提到的
函数
函数接口定义。否,String::someMethod
并不意味着该方法必须是静态的。它可以是一个静态方法,也可以是一个将在某个String
实例上执行的实例方法。该实例将充当由该方法引用实现的函数接口的单个方法的隐式参数
因此,String::length
确实有一个参数-调用length
方法的String
实例
String::length
相当于lambda表达式(String s)->s.length()
(或者只是s->s.length()
)
当您编写
Stream.of(“aaa”、“bbb”、“cccc”).map(String::length)
时,将对流的每个元素执行length()
方法(假设您添加了一些终端操作,导致对这些元素求值map
)它将把流
转换为流
调用方法的对象实例就是您正在查找的缺少参数。请注意您是如何映射字符串实例流的。在这种情况下,为了更好地理解,只需将方法引用替换为lambda表达式。