Java 8 Streams:避免重复的条件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 8 Streams:避免重复的条件?相关的知识,希望对你有一定的参考价值。

有没有办法实现类似下面我的代码类似的东西,而不必避免重复自己,同时保持低处理?

    List<String> alist = new ArrayList<>();
    alist.add("hello");
    alist.add("hello2");

    if(verbose) {
        alist.stream()
                .peek(System.out::println)
                .forEach(/*dostuff*/);
    }
    else {
        alist.stream().forEach(/*dostuff*/);
    }

如上所示,我被迫通过在if或者其他情况下处理流来重复自己,如果流变得有点长,看起来有点难看。

还有另一种选择,在我看来看起来更干净,但应该是性能更差,因为它比较了列表中每个项目的详细布尔值。

    List<String> alist = new ArrayList<>();
    alist.add("helllo");
    alist.add("hello2");

    alist.stream()
            .peek(this::printVerbose)
            .forEach(/*dostuff*/);

}


private void printVerbose(String v) {
    if(verbose) {
        System.out.println(v);
    }

}

答案

你可以这样做:

    Stream<Integer> stream = alist.stream();
    if(verbose) {
        stream = stream
                .peek(System.out::println);
    }
    stream.forEach(/*dostuff*/);
另一答案

当创建要传递给Consumerpeek时,还有另一种方法只检查一次标志。您需要以下方法:

public static <T> Consumer<? super T> logIfNeeded(boolean verbose) {
    return verbose ? System.out::println : t -> { };
}

然后,在您的流管道中:

alist.stream()
        .peek(logIfNeeded(verbose))
        .forEach(/*dostuff*/);

与第二种方法的不同之处在于不检查每个元素的标志;当在流管道声明中调用静态方法时,急切地选择动作。

以上是关于Java 8 Streams:避免重复的条件?的主要内容,如果未能解决你的问题,请参考以下文章

Java 8 Streams 减少删除重复项,保留最新条目

Java 8 Streams过滤器延迟评估的意图[重复]

从 DynamoDB 流复制到 Kinesis Data Streams 时如何维护顺序并避免重复记录?

Java 8如何操作一个列表中的对象并将其收集到另一个列表中? [重复]

Java 8 不止是Lambdas和Streams

Java 8 中的 Streams API