Java Stream API映射参数

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应该是静态的(因为我是通过类名而不是通过对象引用来调用它)?

谢谢!

Era*_*ran 6

不,String::someMethod并不意味着该方法必须是静态的.它可以是静态方法,也可以是在某个String实例上执行的实例方法.该实例将充当由该方法引用实现的功能接口的单个​​方法的隐式参数.

因此String::length确实有一个参数 - 将调用Stringlength方法的实例.

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>.