繁体   English   中英

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

[英]Java8 streams: generic logger method in stream

我想创建一种在流中打印出信息的方法。 请查看我现有的记录器方法。 方法参数必须是通用的,例如在我的示例字符串和整数中。 在我的情况下,该方法应该返回原始对象。 有人可以告诉我当前方法有什么问题吗?

在此先多谢!

看一下记录器方法

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

在这里查看官方文档: 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

我在这里面临的问题是,第一个映射返回一个整数,因此您尝试使用不存在的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);
    }

}

这对我有效

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()在这里实际做什么。 但基本上,它说

流映射(函数映射器)返回一个流,该流包含将给定函数应用于此流的元素的结果。

编辑:@Ezequiel很好地介绍了Integer.substring

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM