加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何通过使用Java 8流的条件来分隔列表

发布时间:2020-12-15 00:04:23 所属栏目:Java 来源:网络整理
导读:请考虑以下代码: ListInteger odd = new ArrayListInteger(); ListInteger even = null; ListInteger myList = Arrays.asList(1,2,3,4,5,6,7,8,9,10); even = myList.stream() .filter(item - { if(item%2 == 0) { return true;} else { odd.add(item); ret
请考虑以下代码:
List<Integer> odd = new ArrayList<Integer>();
 List<Integer> even = null;  
 List<Integer> myList = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
 even = myList.stream()
              .filter(item -> {
                   if(item%2 == 0) { return true;}
                   else { 
                           odd.add(item); 
                           return false;
                   }
              })
              .collect(Collectors.toList());

我想在这里做的是将一个列表中的偶数和奇数值从不同的列表中获取.

流过滤器()方法对偶数项返回true,流收集器将收集它们.
对于奇数情况,过滤器将返回false,并且项目将永远不会到达收集器.

所以我在另外一个列表中添加了这样的奇数,而在另一个列表中我创建了在其他块下.

我知道这不是使用流的优雅方式.例如,如果我使用并行流,那么将会出现奇数列表中的线程安全问题.由于性能原因,我不能多次使用不同的过滤器(应该是O(n)).

这只是一个用例的例子,列表可以包含任何对象,并且过滤器中的lambda需要根据一些逻辑将它们分离成单独的列表.

简单来说:从列表创建多个列表,其中包含基于某些条件分离的项目.

没有流,它将只是运行一个for循环,并做简单的if else,并根据条件收集项目.

解决方法

以下是一个示例,说明如何以偶数和奇数分隔此列表的元素(数字):
List<Integer> myList = Arrays.asList(1,10);

Map<Boolean,List<Integer>> evenAndOdds = myList.stream()
        .collect(partitioningBy(i -> i % 2 == 0));

你会得到这样的偶数/奇数列表(列表可能是空的):

List<Integer> even = evenAndOdds.get(true);
List<Integer> odd = evenAndOdds.get(false);

您可以在partitionsBy中传递任何需要逻辑的lambda.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读