根据 Stream api 的条件将列表拆分为子列表

新手上路,请多包涵

我有一个具体问题。有一些类似的问题,但这些问题要么与 Python 相关,而不与 Java 相关,要么即使问题听起来相似,但要求也不同。

我有一个值列表。

 List1 = {10, -2, 23, 5, -11, 287, 5, -99}

归根结底,我想根据它们的值拆分列表。我的意思是,如果该值大于零,它将保留在原始列表中,负值列表中的相应索引将被设置为零。如果该值小于零,它将转到负值列表,并将原始列表中的负值替换为零。

结果列表应该是这样的;

 List1 = {10, 0, 23, 5, 0, 287, 5, 0}
List2 = {0, -2, 0, 0, -11, 0, 0, -99}

有什么办法可以用 Java 中的 Stream api 解决这个问题吗?

原文由 drJava 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 791
2 个回答

如果你想在单个 Stream 操作中完成它,你需要一个自定义收集器:

 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));

原文由 Holger 发布,翻译遵循 CC BY-SA 3.0 许可协议

Map<Boolean, List<Integer>> results=
  List1.stream().collect(Collectors.partitioningBy( n -> n < 0));

我认为这个更漂亮,更容易阅读。 (然后您可以从地图中获取负面和非负面列表。)

原文由 Tamas 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题