介绍
我们已经非常熟悉了,Stream流中可以采用distinct()去除重复元素。
Integer[] integers = new Integer[] {
1, 2, 1, 3, 4, 4 };
List<Integer> distinctSort = Arrays.stream(integers).distinct().collect(Collectors.toList());
System.out.println(distinctSort); // 去重结果:[1, 2, 3, 4]
那么反过来思考下,如何保留重复元素呢?
例如:{ 1, 2, 1, 3, 4, 4 }
输出结果:[1,4]
基本类型数组保留重复元素
//基本类型 list找到所有重复的int
//利用set不可重复性保留
Integer[] numbers = new Integer[] {
1, 2, 1, 3, 4, 4 };
Set<Integer> allItems = new HashSet<>();
Set<Integer> duplicates = Arrays.stream(numbers)
.filter(n -> !allItems.add(n)) //Set.add() 返回fasle 如果set已经存在元素
.collect(Collectors.toSet());
System.out.println(duplicates);
对象数组保留重复元素
存在一个computer对象,需要在list数组中保留osName相同的computer对象
class Computer{
int id;
String osName;
}
Computer c1 = new Computer(1, "Window10");
Computer c2 = new Computer(2, "Linux");
Computer c3 = new Computer(3, "MacOs");
Computer c4 = new Computer(4, "Window10");
Computer c5 = new Computer(5, "Window10");
List<Computer> list = new ArrayList<>();
list.add(c1);
list.add(c2);
list.add(c3);
list.add(c4);
list.add(c5);
//对象类型 找到所有value重复的list
//基本思路:groupingBy分组,然后找到分组中个数大于1的value
List<Computer> collect = list.stream().collect(Collectors.groupingBy(Computer::getOsName))
.entrySet().stream().filter(e -> e.getValue().size() > 1)
.flatMap(e -> e.getValue().stream()).collect(Collectors.toList());
System.out.println(collect);