使用steam流對list中物件形式的資料根據某一個欄位去重和統計某一個欄位出現次數
阿新 • • 發佈:2021-01-08
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);
再輸出一下