ストリームの実践 (4): ストリーム内で繰り返される要素を保持するにはどうすればよいですか? (基本型オブジェクト)

導入

私たちは、distinct() を使用して 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]

では、逆に考えてみましょう。繰り返される要素を保持するにはどうすればよいでしょうか?
例: { 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);

オブジェクト配列は重複した要素を保持します

コンピュータオブジェクトがあり、同じosNameを持つコンピュータオブジェクトをリスト配列に保持する必要があります。

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);

おすすめ

転載: blog.csdn.net/qq_44716086/article/details/129790712