首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Stream的条件将列表拆分为子列表

基于Stream的条件将列表拆分为子列表
EN

Stack Overflow用户
提问于 2017-07-10 08:03:33
回答 7查看 42.7K关注 0票数 33

我有一个具体的问题。有一些类似的问题,但这些问题要么是Python的问题,要么是Java的问题,或者需求是不同的,即使问题听起来很相似。

我有一张价值清单。

代码语言:javascript
复制
List1 = {10, -2, 23, 5, -11, 287, 5, -99}

最后,我想根据他们的价值观来划分名单。我的意思是,如果值大于零,它将停留在原来的列表中,而在负值列表中相应的索引将被设置为零。如果值小于零,它将转到负值列表中,而原始列表中的负值将被替换为零。

由此产生的清单应该是这样的;

代码语言:javascript
复制
List1 = {10, 0, 23, 5, 0, 287, 5, 0}
List2 = {0, -2, 0, 0, -11, 0, 0, -99}

有没有办法用Java中的Stream来解决这个问题?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2017-07-10 08:40:40

如果要在单个Stream操作中执行此操作,则需要一个自定义收集器:

代码语言:javascript
复制
List<Integer> list = Arrays.asList(10, -2, 23, 5, -11, 287, 5, -99);

List<List<Integer>> result = list.stream().collect(
    () -> Arrays.asList(new ArrayList<>(), new ArrayList<>()),
    (l,i) -> { l.get(0).add(Math.max(0, i)); l.get(1).add(Math.min(0, i)); },
    (a,b) -> { a.get(0).addAll(b.get(0)); a.get(1).addAll(b.get(1)); });

System.out.println(result.get(0));
System.out.println(result.get(1));
票数 16
EN

Stack Overflow用户

发布于 2018-09-24 14:29:42

代码语言:javascript
复制
Map<Boolean, List<Integer>> results=
  List1.stream().collect(Collectors.partitioningBy( n -> n < 0));

我认为这个更漂亮,更容易读懂。(然后,您可以从地图中得到否定和非否定的列表。)

票数 77
EN

Stack Overflow用户

发布于 2019-04-03 10:59:27

因为Java 12使用Collectors::teeing可以很简单地完成它

代码语言:javascript
复制
var divided = List.of(10, -2, 23, 5, -11, 287, 5, -99)
            .stream()
            .collect(Collectors.teeing(
                    Collectors.mapping(i -> Math.max(0, i), Collectors.toList()),
                    Collectors.mapping(i -> Math.min(0, i), Collectors.toList()),
                    List::of
            ));
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45006727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档