用java语言,用stream来写,两个集合的交,并,差集合
时间: 2023-04-01 18:04:56 浏览: 102
好的,这是一个关于 Java 语言的问题。使用 Stream 来实现两个集合的交集、并集和差集可以这样做:
// 假设有两个集合 A 和 B
List<Integer> A = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> B = Arrays.asList(4, 5, 6, 7, 8);
// 交集
List<Integer> intersection = A.stream().filter(B::contains).collect(Collectors.toList());
// 并集
List<Integer> union = Stream.concat(A.stream(), B.stream()).distinct().collect(Collectors.toList());
// 差集
List<Integer> difference = A.stream().filter(item -> !B.contains(item)).collect(Collectors.toList());
以上就是使用 Stream 实现两个集合的交集、并集和差集的方法。希望能对你有所帮助。
相关问题
java 用stream方式比较两个集合中某属性的差异,获得增删改的集合
假设有两个集合`list1`和`list2`,它们包含的元素类型相同,且元素都有一个属性`id`,下面是使用Java 8的Stream API来比较两个集合中元素的差异,获取增删改的集合的代码示例:
```java
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
// 构造测试用的两个集合
List<Person> list1 = List.of(new Person(1, "Tom"), new Person(2, "Jerry"), new Person(3, "Bob"));
List<Person> list2 = List.of(new Person(2, "Jerry"), new Person(3, "Alice"), new Person(4, "David"));
// 获取 list1 中被删除的元素的集合
Set<Integer> deletedIds = list1.stream()
.filter(p -> list2.stream().noneMatch(q -> q.getId() == p.getId()))
.map(Person::getId)
.collect(Collectors.toSet());
System.out.println("deletedIds: " + deletedIds); // 输出 "deletedIds: [1]"
// 获取 list2 中新增的元素的集合
List<Person> addedPersons = list2.stream()
.filter(p -> list1.stream().noneMatch(q -> q.getId() == p.getId()))
.collect(Collectors.toList());
System.out.println("addedPersons: " + addedPersons); // 输出 "addedPersons: [Person{id=4, name='David'}]"
// 获取 list1 和 list2 中相同 id 的元素中,name 属性不同的元素的集合
Map<Integer, String> list1IdToName = list1.stream().collect(Collectors.toMap(Person::getId, Person::getName));
Map<Integer, String> list2IdToName = list2.stream().collect(Collectors.toMap(Person::getId, Person::getName));
Set<Integer> commonIds = list1IdToName.keySet().stream().filter(list2IdToName::containsKey).collect(Collectors.toSet());
List<Person> changedPersons = commonIds.stream().filter(id -> !list1IdToName.get(id).equals(list2IdToName.get(id)))
.map(id -> list2.stream().filter(p -> p.getId() == id).findFirst().get())
.collect(Collectors.toList());
System.out.println("changedPersons: " + changedPersons); // 输出 "changedPersons: [Person{id=3, name='Alice'}]"
}
}
class Person {
private int id;
private String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
```
在上面的代码中,我们使用了Stream API的各种操作来获取删除、新增和修改的元素集合。其中,我们使用了filter、map、noneMatch、collect等操作来实现集合差异的计算。
java两个Map集合Stream为一个list集合最优案例
假设有两个Map集合,分别是map1和map2,我们想要将它们合并为一个List集合,可以使用Java 8的Stream API,代码如下:
```
List<String> list = Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
.map(entry -> entry.getKey() + ":" + entry.getValue())
.collect(Collectors.toList());
```
上面的代码先使用Stream.concat()方法将两个Map的entrySet的Stream合并为一个Stream,然后使用map()方法将每个entry转换为一个字符串,再使用collect()方法将结果收集到一个List集合中。
需要注意的是,Map集合中的key和value需要根据实际情况进行转换为字符串的操作。
阅读全文