3 回答
TA贡献1831条经验 获得超10个赞
为什么不使用 Stream#peek()?
.peek()这看起来像是您可能想要使用而不是地图的示例。它专为打印而设计,您无需担心退回任何东西!
它可能看起来更像:
stream.peek(it -> System.out.println(it.length))
.peek(it -> System.out.println(it.substring(0, 2))
// presumably other functions here before collecting...
.collect(Collectors.toList());
在此处查看官方文档:https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#peek-java.util.function.Consumer-
回到最初的问题
为了解决您之前的问题,您可能想要更新您的函数,以便它采用 T 的纯示例和 T 的转换。您可以将其更新为如下所示:
public static <T, R> T logger(T t, Function<T, R> transform) {
R logLine = transform.apply(t);
System.out.println(logLine);
return t;
}
你的代码看起来像
stream.map(element -> logger(element, element::length)) // and so on
TA贡献2037条经验 获得超6个赞
我在这里面临的问题是第一个地图返回一个整数,所以你试图使用Integer.substring不存在的。
我在你的情况下推荐的是使用peek而不是map https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#peek-java.util.function.Consumer-
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class InferType {
public static void main(String[] args) {
Stream<String> stream = Stream.of("A", "BC", "XYZ");
stream.peek(t -> logger(t.length()))
.peek(t-> logger(t.substring(0, 2)))
.collect(Collectors.toList());
}
public static <T> void logger(T t) {
System.out.println(t);
}
}
TA贡献1824条经验 获得超8个赞
这对我有用
import java.util.stream.*;
class Main {
public static void main(String[] args) {
Stream<String> stream = Stream.of("AX", "BC", "XYZ");
stream.map(t -> logger(t))
.map(t-> logger(t.substring(0, 1)))
.collect(Collectors.toList());
/* or this
stream.map(t -> logger(t))
.collect(Collectors.toList());
*/
}
public static <T> T logger(T t) {
System.out.println(t);
return t;
}
}
在此处查看 stream() map() 的真正作用。但基本上,它说
Stream map(Function mapper) 返回一个流,该流由将 > 给定函数应用于此流的元素的结果组成。
添加回答
举报