为了账号安全,请及时绑定邮箱和手机立即绑定

Java8 流:流中的通用记录器方法

Java8 流:流中的通用记录器方法

开心每一天1111 2023-05-17 14:56:48
我想创建一种打印流中信息的方法。请看看我现有的记录器方法。方法参数必须像我的示例字符串和整数一样是通用的。该方法应该返回原始对象,在我的例子中是字符串。有人能告诉我我目前的方法有什么问题吗?非常感谢!查看记录器方法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) 的类型参数
查看完整描述

3 回答

?
慕哥6287543

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


查看完整回答
反对 回复 2023-05-17
?
阿晨1998

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);

    }


}


查看完整回答
反对 回复 2023-05-17
?
有只小跳蛙

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) 返回一个流,该流由将 > 给定函数应用于此流的元素的结果组成。


查看完整回答
反对 回复 2023-05-17
  • 3 回答
  • 0 关注
  • 132 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信