1. 程式人生 > 其它 >使用steam流對list中物件形式的資料根據某一個欄位去重和統計某一個欄位出現次數

使用steam流對list中物件形式的資料根據某一個欄位去重和統計某一個欄位出現次數

技術標籤:javaspring

1.定義一個物件

例如 一個car類,只有id和name兩個欄位

public class Car {


    private String Name;
    private String id;

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Car{" +
                "Name='" + Name + '\'' +
                ", id='" + id + '\'' +
                '}';
    }

然後造一些資料

ArrayList<Car> list = new ArrayList<>();

        Car car = new Car();
        car.setId("aaaa");
        car.setName("1232131");
        list.add(car);

        Car car1 = new Car();
        car1.setId("aaaa");
        car1.setName("11341");
        list.add(car1);

        Car car2 = new Car();
        car2.setId("aaaa");
        car2.setName("12412");
        list.add(car2);

        Car car3 = new Car();
        car3.setId("bbbb");
        car3.setName("1233124");
        list.add(car3);

輸出一下

在這裡插入圖片描述

去重

例如: 我們想要根據Car這個類中的id這個欄位進行去重,原本我們可以使用map來去重,考慮到for迴圈遍歷比較浪費時間,我們可以使用

List<Car> collect = list.stream().distinct().collect(Collectors.toList());

來進行去重

注意

但是,想要根據物件中某個屬性去重的時候,必須要重寫equals和hashcode方法,並且只能新增我們想要去重的那個欄位,就像上面我們要根據id去重時

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Car car = (Car) o;
        return Objects.equals(id, car.id);
    }

    @Override
    public int hashCode() {

        return Objects.hash(id);
    }

最後我們去重後再輸出一下
在這裡插入圖片描述

2.然後還有根據某一個欄位統計次數

這個我也是在百度上查到的,先把物件中的某一個欄位取出來作為一個集合,還是用Car為例

List<String> collect1 = list.stream().map(r -> r.getId()).collect(Collectors.toList());
        System.out.println(collect1);

輸出一下
在這裡插入圖片描述

然後我想找出某一個id出現兩次以上的

 List<String> collect = collect1.stream()
                .collect(Collectors.toMap(e -> e, e -> 1, (a, b) -> a + b)) // 獲得元素出現頻率的 Map,鍵為元素,值為元素出現的次數
                .entrySet().stream() // Set<Entry>轉換為Stream<Entry>
                .filter(entry -> entry.getValue() > 2) // 過濾出元素出現次數大於 5 的 entry
                .map(entry -> entry.getKey()) // 獲得 entry 的鍵(重複元素)對應的 Stream
                .collect(Collectors.toList());

        System.out.println(collect);

再輸出一下
在這裡插入圖片描述