1. 程式人生 > 其它 >去重 list_Java8新特性利用流和Lambda表示式對List集合常用處理(java筆記)

去重 list_Java8新特性利用流和Lambda表示式對List集合常用處理(java筆記)

技術標籤:去重 list

最近在做專案的過程中經常會接觸到 lambda 表示式,隨後發現它基本上可以替代所有 for 迴圈,包括增強for迴圈。也就是我認為,絕大部分的for迴圈都可以用 lambda 表示式改寫。

lambda表示式有它自己的優點:(1)簡潔,(2)易平行計算。尤其適用於遍歷結果,迴圈計算數值或者賦值的時候非常方便。

缺點: (1)若不用平行計算,很多時候計算速度沒有比傳統的 for 迴圈快。

   (2)不容易使用debug模式除錯。

   (3)在 lambda 語句中直接強制型別轉換不方便。

   (4)不可以在foreach中修改foreach外面的值。

下面是一些我再開發過程中經常使用過的表示式去處理list集合。

(1)先新建一個實體類

 1 public class Person { 2  3     private String name; 4     private int age; 5     private int size; 6     public String getName() { 7         return name; 8     } 9     public void setName(String name) {10         this.name = name;11     }12     public int getAge() {13         return age;14     }15     public void setAge(int age) {16         this.age = age;17     }18     public int getSize() {19         return size;20     }21     public void setSize(int size) {22         this.size = size;23     }24     @Override25     public String toString() {26         return "Person [name=" + name + ", age=" + age + ", size=" + size + "]";27     }28     public Person(String name, int age, int size) {29         super();30         this.name = name;31         this.age = age;32         this.size = size;33     }34     public Person() {35         super();36         // TODO Auto-generated constructor stub37     }38     39 }
702c8bb7a4d9e587cb53f1a193b36471.gif

(2)寫主函式。剩下的說明會寫在程式碼中

702c8bb7a4d9e587cb53f1a193b36471.gif
 1 public class Jdk8Main { 2  3     public static void main(String[] args) { 4         List list = new ArrayList<>(); 5         Person p1 = new Person("張1",1,1); 6         Person p101 = new Person("張101",101,101); 7         Person p2 = new Person("張2",2,2); 8         Person p3 = new Person("張3",3,3); 9         Person p4 = new Person("張4",4,4);10         Person p5 = new Person("張5",5,5);11         Person p6 = new Person("張6",6,6);12         list.add(p1);13         list.add(p2);14         list.add(p3);15         list.add(p4);16         list.add(p5);17         list.add(p6);18         list.add(p101);19         20         /**21          * 1.forEach()進行遍歷集合22          *    item:可以是任意值。類似於for迴圈中的迴圈值23          */24         list.forEach(item->{25             //設定值26             item.setName(item.getName()+"測試");;27             //輸出語句28             System.out.println(item.toString());29         });30         31         /**32          * 2.stream()流操作33          */34         //2.1. 去重 distinct() 去重;collect(Collectors.toList())。封裝成集合35         List distinctList = list.stream().distinct().collect(Collectors.toList());36         //2.2 排序  sorted((第一個物件,第二個物件)->返回值)  (升降序看是第幾個物件與第幾個物件比較)37         List sortedList = list.stream().sorted((o1,o2)->o1.getAge()-o2.getAge()).collect(Collectors.toList());38         //2.3 過濾 , filter(item->{})   item為每一項。 按照自己的需求來篩選list中的資料39         List filterList = list.stream().filter(item->item.getAge()>3).collect(Collectors.toList());40         //2.4 map(), 提取物件中的某一元素.  用每一項來獲得屬性(也可以直接用  物件::get屬性())41         List mapList1 = list.stream().map(Person::getName).collect(Collectors.toList());42         List mapList2 = list.stream().map(item->item.getName()).collect(Collectors.toList());43         //2.5 統計 sum() 。mapToDouble() 轉換成double。還有其他型別轉換。可以自己研究。44         //           max(),min(),average()45         double sum = list.stream().mapToDouble(Person::getAge).sum();46         //2.6 分組   Collectors.groupingBy(屬性名)47         Map> map = list.stream().collect(Collectors.groupingBy(Person::getAge));48         //2.7 多重分組 Collectors.groupingBy(屬性,Collectors.groupingBy(屬性))49         Map>> map2 = list.stream().collect(Collectors.groupingBy(t->t.getName(),Collectors.groupingBy(t->t.getAge())));50         //2.8 分組並計算綜合        Collectors.summarizingLong()51         Map> map3 = list.stream().collect(Collectors.groupingBy(t->t.getName(),Collectors.groupingBy(t->t.getAge(),Collectors.summarizingLong(Person::getSize))));52         53         /**54          *  3.  集合比較的簡寫方式55          */56         list.sort((o1,o2)->{return o1.getAge()-o2.getAge();});57     }58 }