猿问

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;

  }

错误:无法推断 map(Function) 的类型参数


开心每一天1111
浏览 133回答 3
3回答

慕哥6287543

为什么不使用 Stream#peek()?.peek()这看起来像是您可能想要使用而不是地图的示例。它专为打印而设计,您无需担心退回任何东西!它可能看起来更像:stream.peek(it -> System.out.println(it.length))&nbsp; &nbsp; .peek(it -> System.out.println(it.substring(0, 2))&nbsp; &nbsp; // presumably other functions here before collecting...&nbsp; &nbsp; .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) {&nbsp; R logLine = transform.apply(t);&nbsp; System.out.println(logLine);&nbsp; return t;}你的代码看起来像stream.map(element -> logger(element, element::length)) // and so on

阿晨1998

我在这里面临的问题是第一个地图返回一个整数,所以你试图使用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 {&nbsp; &nbsp; public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; Stream<String> stream = Stream.of("A", "BC", "XYZ");&nbsp; &nbsp; &nbsp; &nbsp; stream.peek(t -> logger(t.length()))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .peek(t-> logger(t.substring(0, 2)))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toList());&nbsp; &nbsp; }&nbsp; &nbsp; public static <T> void logger(T t) {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(t);&nbsp; &nbsp; }}

有只小跳蛙

这对我有用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) 返回一个流,该流由将 > 给定函数应用于此流的元素的结果组成。
随时随地看视频慕课网APP

相关分类

Java
我要回答