我想创建一种在流中打印出信息的方法。请查看我现有的记录器方法。 方法参数必须是通用的,例如在我的示例字符串和整数中。 在我的情况下,该方法应该返回原始对象。 有人可以告诉我当前方法有什么问题吗?
非常感谢!
看看记录器方法
Stream<String> stream = Stream.of("A", "BC", "XYZ");
stream.map(t -> logger(t.length()))
.map(t-> logger(t.substring(0, 2)))
.collection(Collectors.toList());
public static <T> T logger(T t) {
System.out.println(t);
return t;
}
错误:无法推断map(函数)的类型参数
答案 0 :(得分:5)
这看起来像是您可能想在其中使用.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());
要解决您的上一个问题,您可能希望更新函数,使其仅包含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
答案 1 :(得分:1)
我在这里面临的问题是,第一个映射返回一个整数,因此您正在尝试使用不存在的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);
}
}
答案 2 :(得分:0)
这对我有效
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()的实际作用here。但基本上,它说
Stream map(函数映射器)返回一个流,该流包含将给定函数应用于此流的元素的结果。
编辑:@Ezequiel对Integer.substring