Lambda表達式處理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 @Override 25 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 stub 37 } 38 39 }
(2)寫主函數。剩下的說明會寫在代碼中
1 public class Jdk8Main { 2 3 public static void main(String[] args) { 4 List<Person> 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<Person> distinctList = list.stream().distinct().collect(Collectors.toList()); 36 //2.2 排序 sorted((第一個對象,第二個對象)->返回值) (升降序看是第幾個對象與第幾個對象比較) 37 List<Person> sortedList = list.stream().sorted((o1,o2)->o1.getAge()-o2.getAge()).collect(Collectors.toList()); 38 //2.3 過濾 , filter(item->{}) item為每一項。 按照自己的需求來篩選list中的數據 39 List<Person> filterList = list.stream().filter(item->item.getAge()>3).collect(Collectors.toList()); 40 //2.4 map(), 提取對象中的某一元素. 用每一項來獲得屬性(也可以直接用 對象::get屬性()) 41 List<String> mapList1 = list.stream().map(Person::getName).collect(Collectors.toList()); 42 List<String> 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<Integer, List<Person>> map = list.stream().collect(Collectors.groupingBy(Person::getAge)); 48 //2.7 多重分組 Collectors.groupingBy(屬性,Collectors.groupingBy(屬性)) 49 Map<String, Map<Integer, List<Person>>> map2 = list.stream().collect(Collectors.groupingBy(t->t.getName(),Collectors.groupingBy(t->t.getAge()))); 50 //2.8 分組並計算綜合 Collectors.summarizingLong() 51 Map<String, Map<Integer, LongSummaryStatistics>> 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 }