Java Stream API 映射参数

标签 java java-8 java-stream

我对 Java 8 静态方法引用有一些误解。

下列说法正确的是:

Stream.of("aaa", "bbb", "cccc").map(String::length);

据我所知map需要 Function<T, R> interface作为参数,方法类似于:

R apply(T t);

然而,length() String的方法|类不接受任何参数:

public int length() {
    return value.length;
}

1) 它与 apply 有何关联?需要参数的方法 T t

2) 如果我写 String::someMethod这不是说someMethod吗?应该是静态的(因为我是通过类名而不是对象引用来调用它的)?

谢谢!

最佳答案

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

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

关于Java Stream API 映射参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49936865/

相关文章:

java - 生产者消费者线程间通信

java - 当查询在 phpmyadmin 中运行时,JDBC 抛出语法错误

java - 减少列表<CompletableFuture<T>>

java - 从 IntStream 对象中的 mapToObj 函数返回 Callable<Double> 列表

java - 如何有条件地修改 Java 8 流 API 中的 map ?

java - 在 Java 中获取压缩的 X9.62 编码的 EC 公钥

java - 无法将 Java 项目性质添加到嵌套 m2Eclipse 项目

java - 计算多篇文章中的关键字出现次数

java - 流式传输迭代器的最简单方法

java - 在可选列表列表中查找字符串