java - Java8流:流中的通用记录器方法
问题描述
我想创建一个在流中打印出信息的方法。请看一下我现有的记录器方法。方法参数必须是通用的,就像我的示例字符串和整数一样。该方法应该返回原始对象,在我的例子中是字符串。有人能告诉我我目前的方法有什么问题吗?
提前非常感谢!
查看记录器方法
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;
}
错误:无法推断映射(函数)的类型参数
解决方案
为什么不使用 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());
回到原来的问题
为了解决您之前的问题,您可能想要更新您的函数,以便它采用 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
推荐阅读
- java - JavaFX 无法将数字添加到数据库列
- node.js - PhantomJS 按钮在页面上单击两次
- android - Detox 不在 Android 上运行测试,但在 iOS 上运行良好
- php - 在 SNMP oids 上正确排序
- mongodb - 查找并更新数组大小小于字段值的文档
- javascript - Jquery淡出不适用于Jquery加载的内容?
- javascript - 如何将输出从一个文本区域传递到不同的文本区域
- symfony - 将对象绑定到 Symfony 表单
- node.js - 在侦听另一个地方的更改时尝试更新 firebase 数据库中的值(云功能)
- elm - 带和不带 (..) 的 Elm 模块导入