introduce
We are already very familiar with the fact that distinct() can be used to remove duplicate elements in the Stream stream.
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]
So think about it in reverse, how to retain repeated elements?
For example: { 1, 2, 1, 3, 4, 4 }
Output result: [1,4]
Basic type array retains duplicate elements
//基本类型 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);
Object array retains duplicate elements
There is a computer object, and it is necessary to retain computer objects with the same osName in the list array.
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);