Uma*_*mar 12 java java-8 java-stream
在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());
}
Run Code Online (Sandbox Code Playgroud)
我正在添加过滤器
.filter(k - > isAccessDisplayEnabled((Source) k)))
Run Code Online (Sandbox Code Playgroud)
在基于if-else条件的流上.有没有办法避免if-else,因为如果有更多的过滤器出现,那么它将很难维护.
请告诉我
Hol*_*ger 17
一种方法是
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());
Run Code Online (Sandbox Code Playgroud)
另一个
src = sourceMeta.getAllSources.parallelStream().map(x -> (Source)x)
.filter(isAccessDisplayEnabled? s - > isAccessDisplayEnabled(s): s -> true)
.filter(s - > containsAll(s, substrings, searchString))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
在任何一种情况下,请注意如何在开头执行一个类型转换简化了整个流管道.
这两种解决方案都避免重新评估isAccessDisplayEnabled
每个流元素,但是,第二种解决方案依赖于JVM s -> true
在此代码变得性能至关重要时的内联功能.
您的条件与您的方法同名。我假设你的意思是让它们变得不同,所以假设是这样的:
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());
}
Run Code Online (Sandbox Code Playgroud)
如果你想删除 if/else,你可以在第一个过滤器中执行检查:
src = (List < Source > ) sourceMeta.getAllSources.parallelStream()
.filter(k - > !someCondition || isAccessDisplayEnabled((Source) k))
.filter(k - > containsAll((Source) k, substrings, searchString))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
在 else 情况下,您采取一切并删除 isAccessDisplayEnabled() 方法调用,因此条件实际上是“如果 someCondition 为 false 或 isAccessDisplayEnabled(k)”。如果 someCondition 结果为 false,则跳过 isAccessDisplayEnabled() 检查。
归档时间: |
|
查看次数: |
18927 次 |
最近记录: |