在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条件的流上的。有没有办法避免if-else,因为如果有更多的过滤器出现,那么它将难以维护。
请告诉我
答案 0 :(得分:13)
一种方法是
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());
在任何一种情况下,请注意如何在开头执行一个类型转换简化整个流管道。
这两个解决方案都避免为每个流元素重新评估isAccessDisplayEnabled
,但是,当这个代码变得性能至关重要时,第二个解决方案依赖于JVM的内联s -> true
功能。
答案 1 :(得分:1)
您的情况与您的方法名称相同。我会假设你的意思是那些与众不同的东西,所以我们就说这就是:
if (someCondition) {
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());
}
如果要删除if / else,可以在第一个过滤器中执行检查:
src = (List < Source > ) sourceMeta.getAllSources.parallelStream()
.filter(k - > !someCondition || isAccessDisplayEnabled((Source) k))
.filter(k - > containsAll((Source) k, substrings, searchString))
.collect(Collectors.toList());
在else的情况下,你取出所有内容并删除isAccessDisplayEnabled()方法调用,因此条件实际上是“如果someCondition为false或isAccessDisplayEnabled(k)”。如果someCondition结果为false,则跳过isAccessDisplayEnabled()检查。