Lambda表達(dá)式:簡(jiǎn)潔地表示可傳遞的匿名函數(shù)的一種方式睡互。
lambda用于何處:在函數(shù)式接口上使用Lambda表達(dá)式 。
函數(shù)式接口:只定義了一個(gè)抽象方法的接口為函數(shù)式接口(哪怕有很多默認(rèn)方法)瞻坝。
函數(shù)式編程:讓方法作為值。
lambda
labmda格式
(Apple a,Apple b)->b.getWeight().compareTo(a.getWeight())
//箭頭前面括號(hào)內(nèi)的為labmda參數(shù)
//箭頭后面的為labmda主體
下列僅有 4、5不是lambda表達(dá)式
(1) () -> {}
// 這個(gè)Lambda沒有參數(shù),并返回void铅匹。它類似于主體為空的方法:public void run() {}
(2) () -> "Raoul"
// 這個(gè)Lambda沒有參數(shù),并返回String作為表達(dá)式饺藤。
(3) () -> {return "Mario";}
// 這個(gè)Lambda沒有參數(shù)伊群,并返回String(利用顯式返回語(yǔ)句)。
(4) (Integer i) -> return "Alan" + i;
// return是一個(gè)控制流語(yǔ)句策精。要使此Lambda有效,需要使花括號(hào)崇棠,如下所示: (Integer i) -> {return "Alan" + i;}咽袜。
(5) (String s) -> {"IronMan";}
// “Iron Man”是一個(gè)表達(dá)式,不是一個(gè)語(yǔ)句枕稀。要使此Lambda有效询刹,你可以去除花括號(hào) 和分號(hào)谜嫉,如下所示:(String s) -> "Iron Man"“剂或者如果你喜歡沐兰,可以使用顯式返回語(yǔ) 句,如下所示:(String s)->{return "IronMan";}蔽挠。
方法引用規(guī)則
常見方法引用有如下三種:
lambda寫法 | 方法引用方式 | 備注 |
---|---|---|
(args) -> ClassName.staticMethod(args) | ClassName::staticMethod | 其中staticMethod為靜態(tài)方法 |
(arg0, rest) -> arg0.instanceMethod(rest) | ClassName::instanceMethod | 其中ClassName是arg0的類型 |
(args) -> expr.instanceMethod(args) | expr::instanceMethod | expr是實(shí)例化后的對(duì)象 |
Lambda與方法引用實(shí)踐
針對(duì)下面的Apple集合,現(xiàn)有需求根據(jù)重量排序。實(shí)現(xiàn)推導(dǎo)Lambda與方法引用椅棺。
List<Apple> apples = Arrays.asList(new Apple().setColor("red").setWeight(100),
new Apple().setColor("yellow").setWeight(180),
new Apple().setColor("black").setWeight(140));
-
匿名類
apples.sort(new Comparator<Apple>() { public int compare(Apple a1, Apple a2){ return a1.getWeight().compareTo(a2.getWeight()); } });
-
lambda表達(dá)式簡(jiǎn)化
// 1.簡(jiǎn)化 apples.sort((Apple a,Apple b)->b.getWeight().compareTo(a.getWeight())); // 2.使用Comparator接口的comparing方法 apples.sort(Comparator.comparing((Apple a)->a.getWeight()));
-
使用方法引用
apples.sort(Comparator.comparing(Apple::getWeight));
復(fù)合lambda表達(dá)式
比較器復(fù)合
// 原有基礎(chǔ)上逆序
apples.sort(Comparator.comparing(Apple::getWeight).reversed());
// 原有基礎(chǔ)上逆序,一樣重時(shí) 再按顏色排序
apples.sort(Comparator.comparing(Apple::getWeight).reversed()
.thenComparing(Apple::getColor));
謂詞復(fù)合
Predicate<Apple> predicate = (Apple a)->a.getWeight()>100;
Predicate<Apple> predicate2 = (Apple a)->a.getColor().equals("yellow");
// 非
Predicate<Apple> notRedApple = predicate.negate();
// 與
Predicate<Apple> andPredicate = notRedApple.and(predicate2);
apples.stream().filter(notRedApple);
apples.stream().filter(andPredicate);
函數(shù)復(fù)合
Function<Integer, Integer> f = x -> x + 1;
Function<Integer, Integer> g = x -> x * 2;
Function<Integer, Integer> h = f.andThen(g);
int result = h.apply(1);
// 結(jié)果返回4