Java Stream API映射参数

时间:2018-04-20 08:00:29

标签: java java-8 java-stream

我对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>

谢谢!

2 个答案:

答案 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功能接口定义。