不得不說,有些小夥伴的學習熱情真高,學完了Lambda表達式的語法,想來幾個典型案例再強化下。因而問冰河可否給幾個Lambda表達式的典型使用示例。因而乎,便有了這篇文章。java
調用Collections.sort()方法,經過定製排序比較兩個Employee(先比較年齡,年齡相同按姓名比較),使用Lambda表達式做爲參數傳遞。bash
這裏,咱們先建立一個Employee類,爲了知足需求,咱們在Employee類中定義了姓名、年齡和工資三個字段,以下所示。微信
@Data @Builder @ToString @NoArgsConstructor @AllArgsConstructor public class Employee implements Serializable { private static final long serialVersionUID = -9079722457749166858L; private String name; private Integer age; private Double salary; }
接下來,咱們在TestLambda類中定義一個成員變量employees,employees變量是一個List集合,存儲了Employee的一個列表,以下所示。函數
protected List<Employee> employees = Arrays.asList( new Employee("張三", 18, 9999.99), new Employee("李四", 38, 5555.55), new Employee("王五", 60, 6666.66), new Employee("趙六", 8, 7777.77), new Employee("田七", 58, 3333.33) );
前期的準備工做完成了,接下來,咱們就能夠實現具體的業務邏輯了。學習
@Test public void test1(){ Collections.sort(employees, (e1, e2) -> { if(e1.getAge() == e2.getAge()){ return e1.getName().compareTo(e2.getName()); } return Integer.compare(e1.getAge(), e2.getAge()); }); employees.stream().forEach(System.out::println); }
上述代碼比較簡單,我就不贅述具體邏輯了。運行test1方法,得出的結果信息以下所示。ui
Employee(name=趙六, age=8, salary=7777.77) Employee(name=張三, age=18, salary=9999.99) Employee(name=李四, age=38, salary=5555.55) Employee(name=田七, age=58, salary=3333.33) Employee(name=王五, age=60, salary=6666.66)
若是想倒敘輸出如何處理呢,只須要在將return Integer.compare(e1.getAge(), e2.getAge());
修改爲-return Integer.compare(e1.getAge(), e2.getAge());
便可,以下所示。code
@Test public void test1(){ Collections.sort(employees, (e1, e2) -> { if(e1.getAge() == e2.getAge()){ return e1.getName().compareTo(e2.getName()); } return -Integer.compare(e1.getAge(), e2.getAge()); }); employees.stream().forEach(System.out::println); }
再次運行test1方法,得出的結果信息以下所示。對象
Employee(name=王五, age=60, salary=6666.66) Employee(name=田七, age=58, salary=3333.33) Employee(name=李四, age=38, salary=5555.55) Employee(name=張三, age=18, salary=9999.99) Employee(name=趙六, age=8, salary=7777.77)
結果符合咱們的需求。blog
1.聲明函數式接口,接口中聲明抽象方法public String getValue(String str);
排序
2.聲明類TestLambda,類中編寫方法使用接口做爲參數,將一個字符串轉換爲大寫,並做爲方法的返回值。
3.再將一個字符串的第2個和第4個索引位置進行截取子串。
首先,建立一個函數式接口MyFunction,在MyFunction接口上加上註解@FunctionalInterface標識接口是一個函數式接口。以下所示。
@FunctionalInterface public interface MyFunction { public String getValue(String str); }
在TestLambda類中聲明stringHandler方法,參數分別爲待處理的字符串和函數式接口的實例,方法中的邏輯就是調用函數式接口的方法來處理字符串,以下所示。
public String stringHandler(String str, MyFunction myFunction){ return myFunction.getValue(str); }
接下來,咱們實現將一個字符串轉換爲大寫的邏輯,以下所示。
@Test public void test2(){ String value = stringHandler("binghe", (s) -> s.toUpperCase()); System.out.println(value); }
運行test2方法,得出以下的結果信息。
BINGHE
咱們再來實現字符串截取的操做,以下所示。
@Test public void test3(){ String value = stringHandler("binghe", (s) -> s.substring(1, 3)); System.out.println(value); }
注意:需求中是按照第2個和第4個索引位置進行截取子串,字符串的下標是從0開始的,因此這裏截取字符串時使用的是substring(1, 3),而不是substring(2, 4),這也是不少小夥伴容易犯的錯誤。
另外,使用上述Lambda表達式形式,能夠實現字符串的任意處理,並返回處理後的新字符串。
運行test3方法,結果以下所示。
in
1.聲明一個帶兩個泛型的函數式接口,泛型類型爲<T, R>,其中,T做爲參數的類型,R做爲返回值的類型。
2.接口中聲明對象的抽象方法。
3.在TestLambda類中聲明方法。使用接口做爲參數計算兩個long型參數的和。
4.再就按兩個long型參數的乘積。
首先,咱們按照需求定義函數式接口MyFunc,以下所示。
@FunctionalInterface public interface MyFunc<T, R> { R getValue(T t1, T t2); }
接下來,咱們在TestLambda類中建立一個處理兩個long型數據的方法,以下所示。
public void operate(Long num1, Long num2, MyFunc<Long, Long> myFunc){ System.out.println(myFunc.getValue(num1, num2)); }
咱們可使用下面的方法來完成兩個long型參數的和。
@Test public void test4(){ operate(100L, 200L, (x, y) -> x + y); }
運行test4方法,結果以下所示。
300
實現兩個long型數據的乘積,也很簡單。
@Test public void test5(){ operate(100L, 200L, (x, y) -> x * y); }
運行test5方法,結果以下所示。
20000
看到這裏,我相信不少小夥伴已經對Lambda表達式有了更深層次的理解。只要多多練習,就可以更好的掌握Lambda表達式的精髓。
若是以爲文章對你有點幫助,請微信搜索並關注「 冰河技術 」微信公衆號,跟冰河學習Java8新特性。
最後,附上Java8新特性核心知識圖,祝你們在學習Java8新特性時少走彎路。