特別提示:本人博客部分有參考網絡其他博客,但均是本人親手編寫過並驗證通過。如發現博客有錯誤,請及時提出以免誤導其他人,謝謝!歡迎轉載,但記得標明文章出處:
http://www.cnblogs.com/mao2080/
1、簡介
Lambda表達式是Java SE 8中一個重要的新特性。lambda表達式允許你通過表達式來代替功能接口。 lambda表達式就和方法一樣,它提供了一個正常的參數列表和一個使用這些參數的主體(body,可以是一個表達式或一個代碼塊)。Lambda表達式還增強了集合庫。 Java SE 8添加了2個對集合數據進行批量操作的包: java.util.function 包以及java.util.stream 包。 流(stream)就如同迭代器(iterator),但附加了許多額外的功能。 總的來說,lambda表達式和 stream 是自Java語言添加泛型(Generics)和注解(annotation)以來最大的變化。 在本文中,我們將從簡單到復雜的示例中見認識lambda表達式和stream的強悍。
2、特點
λ表達式本質上是一個匿名方法,簡潔,難懂,難以調試,維護人員想罵娘
3、基本語法
(parameters) -> expression
或
(parameters) ->{ statements; }
4、常用方法
package com.mao.com.lambda; import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; public class Test { public static void main(String[] args) { List<User> list = new ArrayList<>(); list.add(new User("1", "張三", "一年級", 95)); list.add(new User("2", "李四", "二年級", 96)); list.add(new User("3", "王五", "三年級", 98)); list.add(new User("4", "朱六", "三年級", 100)); /**遍歷*/ list.forEach((o)->System.out.println("userId:"+o.getUserId()+", userName:"+o.getUserName())); /**遍歷*/ list.forEach(o->{ System.out.println("userId:"+o.getUserId()+", userName:"+o.getUserName()); }); /**轉hashSet*/ Set<User> set1 = list.stream().collect(Collectors.toSet()); /**轉hashSet*/ Set<String> set2 = list.stream().map(User::getUserName).collect(Collectors.toSet()); /**轉treeSet*/ TreeSet<String> set3 = list.stream().map(User::getUserName).collect(Collectors.toCollection(TreeSet::new)); /**轉map*/ Map<String, String> map1 = list.stream().collect(Collectors.toMap(User::getUserId, User::getUserName)); /**轉map*/ Map<String, String> map2 = list.stream().collect(Collectors.toMap(User::getUserId, User::getUserName, (k1, k2)->k1)); /**分組*/ Map<String, List<User>> map3 = list.stream().collect(Collectors.groupingBy(User::getClassName)); /**分組count*/ Map<String, Long> map4 = list.stream().collect(Collectors.groupingBy(User::getClassName, Collectors.counting())); /**分組求和*/ Map<String, Integer> map5 = list.stream().collect(Collectors.groupingBy(User::getClassName, Collectors.summingInt(User::getScore))); /**過濾條件*/ List<User> temp1 = list.stream().filter(o->"1".equals(o.getUserId())).collect(Collectors.toList()); /**多個過濾條件*/ Predicate<User> scoFilter = (o) -> (o.getScore() > 25); Predicate<User> clsFilter = (o) -> ("三年級".equals(o.getClassName())); List<User> temp2 = list.stream().filter(scoFilter).filter(clsFilter).collect(Collectors.toList()); /**取前多少個*/ List<User> temp3 = list.stream().limit(2).collect(Collectors.toList()); /**升序排序*/ List<User> temp4 = list.stream().sorted((u1, u2)->(u1.getScore()-u2.getScore())).collect(Collectors.toList()); /**降序排序*/ List<User> temp5 = list.stream().sorted((u1, u2)->(u2.getScore()-u1.getScore())).collect(Collectors.toList()); /**升序排序*/ User user1 = list.stream().max((u1, u2)->(u1.getScore()-u2.getScore())).get(); /**降序排序*/ User user2 = list.stream().min((u1, u2)->(u1.getScore()-u2.getScore())).get(); /**求和*/ int sum = list.parallelStream().mapToInt(p -> p.getScore()).sum(); /**匯總數據*/ IntSummaryStatistics stats = list.stream().mapToInt((x) -> x.getScore()).summaryStatistics(); System.out.println("最大的數字 : " + stats.getMax()); System.out.println("最小的數字 : " + stats.getMin()); System.out.println("所有數字的總和 : " + stats.getSum()); System.out.println("所有數字的平均值: " + stats.getAverage()); } public static Set<Integer> getIntKeys(int sta, int size){ return Stream.iterate(sta, item -> item+1).limit(size).collect(Collectors.toSet()); } }
1 package com.mao.com.lambda; 2 3 public class User{ 4 5 private String userId; 6 7 private String userName; 8 9 private String className; 10 11 private int score; 12 13 public User() { 14 15 } 16 17 public User(String userId, String userName, String className, int score) { 18 this.userId = userId; 19 this.userName = userName; 20 this.className = className; 21 this.score = score; 22 } 23 24 public String getUserId() { 25 return userId; 26 } 27 28 public void setUserId(String userId) { 29 this.userId = userId; 30 } 31 32 public String getUserName() { 33 return userName; 34 } 35 36 public void setUserName(String userName) { 37 this.userName = userName; 38 } 39 40 public String getClassName() { 41 return className; 42 } 43 44 public void setClassName(String className) { 45 this.className = className; 46 } 47 48 public int getScore() { 49 return score; 50 } 51 52 public void setScore(int score) { 53 this.score = score; 54 } 55 }