Java 8使用Stream流去除一个list中包含另一个list已存在的某个字段的对象
项目场景:
在Java中,我们经常会遇到需要对List中的数据进行操作的情况。有时候,我们需要从一个List中删除另一个List已经包含的数据。这种情况下,我们可以使用Java Stream来简洁高效地完成操作。
代码示例
假设我们有两个对象列表,我们需要从第一个列表中移除第二个列表中已存在的某个字段的对象。
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
class Item {
private String id;
private String name;
// 构造函数、getter和setter省略
public String getId() {
return id;
}
}
public class Main {
public static void main(String[] args) {
List<Item> list1 = new ArrayList<>(); // 假设这是第一个列表
List<Item> list2 = new ArrayList<>(); // 假设这是第二个列表
// 填充数据
list1.add(new Item("1", "Item 1"));
list1.add(new Item("2", "Item 2"));
list1.add(new Item("3", "Item 3"));
list2.add(new Item("2", "Item 2")); // 假设我们要去除list1中包含id为"2"的Item
// 使用stream API去除list1中包含list2的id的元素
List<Item> filteredList1 = list1.stream()
.filter(item1 -> list2.stream().noneMatch(item2 -> item2.getId().equals(item1.getId())))
.collect(Collectors.toList());
// 打印结果
filteredList1.forEach(item -> System.out.println(item.getId() + " - " + item.getName()));
}
}
在这个例子中,我们创建了两个Item
对象的列表。然后我们使用stream()
方法来处理这些列表,并使用filter()
方法来移除那些其id
字段存在于第二个列表中的元素。我们使用noneMatch()
方法来检查第二个列表中是否不存在与当前列表1中元素匹配的id
。最后,我们使用collect()
来收集结果。
扩展:
使用Java 8的Stream API来去除一个列表中存在于另一个列表的元素
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class ListDifference {
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
List<Integer> list2 = new ArrayList<>(Arrays.asList(3, 4, 5, 6, 7));
// 去除list1中存在于list2的元素
List<Integer> difference = list1.stream()
.filter(e -> !list2.contains(e))
.collect(Collectors.toList());
System.out.println(difference); // 输出: [1, 2]
}
}
这段代码会输出list1
中那些不在list2
中的元素。这里使用了filter
操作来排除那些存在于list2
的元素,并最终通过collect
操作将结果收集到一个新的列表中。