前言
這篇文章簡單總結一下Lambda中的常用方法
對Lambda不熟悉的同學,可以參考這篇進行入門對Lambda的理解,Lambda真是越用越爽
如果剛剛入門Lambda,但對Consumer、Supplier、Predicate與Function不怎麼熟悉的同學,可以參考這篇文章快速理解Consumer、Supplier、Predicate與Function
如果已經對Lambda很熟悉的同學,但對其執行原理不太懂的同學,可以參考我的這篇文章Lambda執行原理
先給出一個示例
下面有五個學生,放入到集合中
@Data
@AllArgsConstructor
class Student {
private String name;
private Integer age;
}
Student a = new Student("a", 20);
Student b = new Student("b", 18);
Student c = new Student("c", 22);
Student d = new Student("d", 19);
Student e = new Student("e", 18);
List<Student> list = new ArrayList<>();
list.add(a);
list.add(b);
list.add(c);
list.add(d);
list.add(e);
在日常開發中,可能有以下的需求:
一、遍歷該集合
list.forEach(System.out::println);
forEach接受一個Consumer表達式
二、取出學生姓名
List<String> nameList = list.stream()
.map(Student::getName)
.collect(Collectors.toList());
stream可以將一種形式的流轉化爲另外一種形式的流,上面的代碼,是將包含整個學生對象的流,轉化成了單獨包含姓名的流,最後使用collect方法,將流收集起來。
三、取出年齡大於19歲的學生
List<Student> studentList = list.stream()
.filter(s -> s.getAge() > 19)
.collect(Collectors.toList());
filter接收一個Predicate表達式,將會在流中丟棄不符合表達式的學生對象。
四、取出不重複的學生年齡
List<Integer> ageDistinctList = list.stream()
.map(Student::getAge)
.distinct()
.collect(Collectors.toList());
和mysql的去重關鍵字一樣,都是使用distinct
五、全匹配、任意匹配、都不匹配
需求1:是否所有學生的年齡都在18歲以上(全匹配)
boolean flag = list.stream()
.map(Student::getAge)
.allMatch(i -> i > 18);
需求2:是否有學生的年齡大於21歲(任意匹配)
boolean flag = list.stream()
.map(Student::getAge)
.anyMatch(i -> i > 21);
需求3:是否所有學生的年齡都不大於22歲(都不匹配)
boolean flag = list.stream()
.map(Student::getAge)
.noneMatch(i -> i > 22);
六、排序
需求,按照學生的年齡進行排序
list.stream()
.sorted(Comparator.comparingInt(Student::getAge))
.forEach(System.out::println);
輸出:
默認是按照年齡進行升序輸出,當然也可以降序輸出,只要加上.reversed即可,如下圖
list.stream()
.sorted(Comparator.comparingInt(Student::getAge).reversed())
.forEach(System.out::println);
如果先按照年齡排序,再按照姓名進行排序,則可以寫成:
list.stream()
.sorted(Comparator.comparingInt(Student::getAge).thenComparing(Student::getName))
.forEach(System.out::println);
七、分頁
需求:當前頁是第2頁,每頁顯示3條
list.stream()
.sorted(Comparator.comparingInt(Student::getAge))
.skip((2 - 1) * 3) //(當前頁-1)*每頁顯示條數
.limit(3) //每頁顯示條數
.forEach(System.out::println);
首先按照年齡進行排序,然後跳過上一頁的數據,取出之後的limit條數據。
八、分組
需求:照年齡進行分組
Map<Integer, List<Student>> group = list.stream().collect(Collectors.groupingBy(Student::getAge));
group.forEach((k, v) -> System.out.println("k:" + k + ",v:" + v.toString()));
輸出:
九、字符串拼接
需求:輸出學生姓名用逗號隔開的字符串
String str = list.stream().map(Student::getName).collect(Collectors.joining(","));
System.out.println(str);
輸出:
十、數學運算
需求1:求學生年齡的總和
int sum = list.stream().mapToInt(Student::getAge).sum();
System.out.println(sum);
需求2:求學生年齡的平均數
double average = list.stream()
.mapToInt(Student::getAge)
.average()
.orElse(0.0);
System.out.println(average);
注意,average()返回的是一個OptionalDouble,爲了防止集合中沒有元素時,我們必須使用orElse指定一個默認值。
同理,求最大值使用max,最小值使用min,都需要指定默認值。
持續補充案例....