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*/);
另一答案
当创建要传递给Consumer
的peek
时,还有另一种方法只检查一次标志。您需要以下方法:
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:避免重复的条件?的主要内容,如果未能解决你的问题,请参考以下文章
从 DynamoDB 流复制到 Kinesis Data Streams 时如何维护顺序并避免重复记录?