在Java 8,是有根据条件申请在流过滤的方式,
例
我有这样的流
if (isAccessDisplayEnabled) {
src = (List < Source > ) sourceMeta.getAllSources.parallelStream()
.filter(k - > isAccessDisplayEnabled((Source) k))
.filter(k - > containsAll((Source) k, substrings, searchString))
.collect(Collectors.toList());
} else {
src = (List < Source > ) sourceMeta.getAllSources.parallelStream()
.filter(k - > containsAll((Source) k, substrings, searchString))
.collect(Collectors.toList());
}
我加入过滤器
.filter(k - > isAccessDisplayEnabled((Source) k)))
在流基础上,如果其他条件。有没有办法避免的if-else,因为如果有更多的过滤器来了,那么这将是难以维持。
请告诉我
一种方式来做到这一点是
Stream<Source> stream = sourceMeta.getAllSources.parallelStream().map(x -> (Source)x);
if(isAccessDisplayEnabled) stream = stream.filter(s -> isAccessDisplayEnabled(s));
src = stream.filter(s - > containsAll(s, substrings, searchString))
.collect(Collectors.toList());
另一个
src = sourceMeta.getAllSources.parallelStream().map(x -> (Source)x)
.filter(isAccessDisplayEnabled? s - > isAccessDisplayEnabled(s): s -> true)
.filter(s - > containsAll(s, substrings, searchString))
.collect(Collectors.toList());
在这两种情况下,注意如何执行在开头的一个类型转换,简化了整个流pipline。
这两种解决方案避免了重新评估isAccessDisplayEnabled
每一个流元素,但是,第二个依赖于JVM的能力,内联的s -> true
,当这个代码原来是性能的关键。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句