Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java流API映射参数_Java_Java 8_Java Stream - Fatal编程技术网

Java流API映射参数

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

我对Java8静态方法引用有一些误解

以下是正确的陈述:

Stream.of("aaa", "bbb", "cccc").map(String::length);
AFAIK
map
需要一个
函数接口
作为参数,其方法类似于:

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表达式。