基于条件的Java应用8流过滤器

欧麦尔:

在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章