首页 > 解决方案 > 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;
  }

错误:无法推断映射(函数)的类型参数

标签: javajava-8functional-programmingjava-stream

解决方案


为什么不使用 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

推荐阅读