【问题标题】:Is there any way to delete some elements from a given ArrayList after adding the same elements to a new ArrayList?在将相同的元素添加到新的 ArrayList 后,有没有办法从给定的 ArrayList 中删除一些元素?
【发布时间】:2020-03-14 04:11:00
【问题描述】:

例如,有一个元素列表。 我们在这个列表中调用 streamMethod。现在我们想通过条件从列表中提取某个元素并将其添加到新列表中。

示例:

List<Integer> intList = new ArrayList<>();

for (int i = 0; i < 100; i++) {
        intList.add(i);
}

public static List<Integer> getIntFive(List<Integer> list) {
    return list.stream().filter(i -> i.equals(5)).collect(Collectors.toList());

}

public static List<Integer> getIntEight(List<Integer> list) {
    return list.stream().filter(i -> i.equals(8)).collect(Collectors.toList());

}

有没有办法从原始列表中删除添加到新列表中的项目?是否可以将另一个流链接到第一个流后面,从而影响原始列表的属性?

【问题讨论】:

  • 流式传输时不能删除,但可以使用 List.remove(Object)
  • 你到底想做什么?你能展示一些输入和输出的例子吗?

标签: java arraylist java-8 java-stream


【解决方案1】:

更接近您当前的实现,执行操作的另一种方法是:

public static List<Integer> getIntEight(List<Integer> list) {
    List<Integer> res = list.stream()
            .filter(i -> i.equals(8))
            .collect(Collectors.toList());
    list.removeAll(res);
    return res;
}

【讨论】:

    【解决方案2】:

    流式时不能移除,但迭代两次也无妨,例如:

        List<Integer> initial = new ArrayList<>(List.of(1, 2, 3, 4, 5));
        List<Integer> result = new ArrayList<>();
    
        initial.forEach(x -> {
            if (x > 3) {
                result.add(x);
            }
        });
    
        // or simply : initial.removeAll(result);
        initial.removeIf(result::contains);
    
        System.out.println(initial); // 1,2,3
        System.out.println(result); // 4,5
    

    【讨论】:

      猜你喜欢
      • 2012-11-06
      • 2020-08-27
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 2015-08-19
      • 1970-01-01
      相关资源
      最近更新 更多