Java8新特性利用流和Lambda表達式對List集合常用處理(java筆記)

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

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

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

   (2)不容易使用debug模式調試。

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

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


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

(1)先新建一個實體類

<code> 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 }/<code>
Java8新特性利用流和Lambda表達式對List集合常用處理(java筆記)

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

Java8新特性利用流和Lambda表達式對List集合常用處理(java筆記)

<code> 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>> map = list.stream().collect(Collectors.groupingBy(Person::getAge));
48 //2.7 多重分組 Collectors.groupingBy(屬性,Collectors.groupingBy(屬性))
49 Map<string>>> map2 = list.stream().collect(Collectors.groupingBy(t->t.getName(),Collectors.groupingBy(t->t.getAge())));
50 //2.8 分組並計算綜合 Collectors.summarizingLong()
51 Map<string>> 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 }/<string>/<string>/<integer>/<string>/<string>/<person>/<person>/<person>/<person>/<code>


分享到:


相關文章: