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

时间:2018-10-12 13:20:30

标签: java-8 java-stream

是否有一种方法可以实现类似下面的代码的效果,而不必避免重复自己,同时又保持较低的处理能力?

    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或else情况下处理流(如果流变得更长一点看起来很丑)来重复自己。

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

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

}

2 个答案:

答案 0 :(得分:7)

您可以执行以下操作:

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

答案 1 :(得分:2)

还有另一种方法,当创建要传递给Consumer的{​​{1}}时仅检查标志一次。您需要以下方法:

peek

然后,在您的流管道中:

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

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