java8中Lambda表達(dá)式實現(xiàn)Runnable接口寫法

例1 用Lambda表達(dá)式實現(xiàn)Runnable接口

Java代碼

//Java 之前版本寫法:

new?Thread(new?Runnable() {

@Override

public?void?run() {

System.out.println("Before Java8, too much code for too little to do");

}

}).start();

2滤钱、//Java 8 版本Lambda寫法:

new?Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();

輸出:

too much code, for too little to do

Lambda expression rocks !!

這個例子使我們學(xué)到了java8中Lambda表達(dá)式的書寫方式:

(參數(shù)) -> 表達(dá)式

(參數(shù)) -> 語句

(參數(shù)) -> { 語句 }

為了鞏固知識,下面為你介紹9個例子關(guān)于Lambda表達(dá)式寫法

例如移怯,如果你的方法只是在控制臺打印信息绷旗,則可以這么寫:

Java代碼

() -> System.out.println("Hello Lambda Expressions");

如果你的方法接收兩個參數(shù)蝌焚,那么:

Java代碼

(int?even,?int?odd) -> even + odd

順帶提一句泛源,一般來說在Lambda表達(dá)式中要盡量保持變量的簡潔性篙挽。這會使你的代碼簡短而能保持在一行之內(nèi)冲秽。所以像上面的代碼可以選擇變量名類似a,b或者x,y之類的舍咖,比起even和odd來會更好。

顯示在電腦屏幕上的計算機(jī)程序源代碼锉桑,可用作網(wǎng)絡(luò)科技等素材或背景排霉。

例2 用Lambda表達(dá)式寫事件監(jiān)聽程序

要是你用過Swing API,那就少不了事件監(jiān)聽代碼民轴,這是使用匿名類的經(jīng)典例子」ツ現(xiàn)在我們可以用Lambda表達(dá)式來抒寫更好的事件處理代碼。

Java代碼

// Before Java 8:

JButton show =?new?JButton("Show");

show.addActionListener(new?ActionListener() {

@Override

public?void?actionPerformed(ActionEvent e) {

System.out.println("Event handling without lambda expression is boring");

}

});

// Java 8 way:

show.addActionListener((e) -> {

System.out.println("Light, Camera, Action !! Lambda expressions Rocks");

});

另外一個常用匿名類的地方是給Collections.sort()方法提供自定義的Comparator接口實現(xiàn)后裸。這個地方也可以用Lambda表達(dá)式瑰钮。

例3 用Lambda表達(dá)式進(jìn)行List迭代

Java代碼

//Prior Java 8 :

List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");

for?(String feature : features) {

System.out.println(feature);

}

//In Java 8:

List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");

features.forEach(n -> System.out.println(n));

// 用java8的方法引用更好,方法引用由::(雙冒號)操作符來完成,看起來像c++中的作用域操作符

Java代碼

features.forEach(System.out::println);

輸出:

Lambdas

Default Method

Stream API

Date and Time API

例4 使用Lambda表達(dá)式和函數(shù)式接口Predicate

除了提供函數(shù)式編程語言級別的支持外微驶,java8同時也新增了一個新的包java.util.function浪谴。其中包含了許多類來支持java函數(shù)式編程。其中之一是Predicate接口,使用這個接口和lamb表達(dá)式就可以以更少的代碼為API方法添加更多的動態(tài)行為较店。

以下是Predicate的使用范例士八,展示了過濾集合數(shù)據(jù)的許多共性。

Java代碼

public?static?void?main(args[]){

List languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");

System.out.println("Languages which starts with J :");

filter(languages, (str)->str.startsWith("J"));

System.out.println("Languages which ends with a ");

filter(languages, (str)->str.endsWith("a"));

System.out.println("Print all languages :");

filter(languages, (str)->true);

System.out.println("Print no language : ");

filter(languages, (str)->false);

System.out.println("Print language whose length greater than 4:");

filter(languages, (str)->str.length() > 4);

}

public?static?void?filter(List names, Predicate condition) {

for(String name: names) {

if(condition.test(name)) {

System.out.println(name + " ");

}

}

}

輸出:

Languages which starts with J :

Java

Languages which ends with a

Java

Scala

Print all languages :

Java

Scala

C++

Haskell

Lisp

Print no language :

Print language whose length greater than 4:

Scala

Haskell

Java代碼

//更佳的方式

public?static?void?filter(List names, Predicate condition) {

names.stream().filter((name) -> (condition.test(name))).forEach((name) -> {

System.out.println(name + " ");

});

}

可以看到Stream API的filter方法也接受一個Predicate梁呈,意味著可以用內(nèi)聯(lián)代碼直接替換我們自定義的filter()方法婚度。這就是Lambda表達(dá)式的威力所在。除此之外Predicate接口也可以測試多個條件官卡,將會在下面的例子中加以說明蝗茁。

例5: Lambda表達(dá)式結(jié)合Predicate

就像上個例子所說,Predicate允許組合兩個以上的條件寻咒,它提供了類似于邏輯與和或的操作and(),or()和xor()哮翘,這些方法可以用來組合傳遞到filter方法中的多個條件。例如為了獲取所有以J開頭并有四個字符長度的語言毛秘,可以定義兩個單獨的Predicate實例覆蓋每個條件然后用and方法將它們組合在一起饭寺。看例子:

Java代碼

Predicate<String> startsWithJ = (n) -> n.startsWith("J");

Predicate<String> fourLetterLong = (n) -> n.length() == 4;

names.stream().filter(startsWithJ.and(fourLetterLong)).forEach((n) -> System.out.print("\nName, which starts with 'J' and four letter long is : " + n));

類似可以用or或者xor叫挟。這個例子也強(qiáng)調(diào)了單獨用或者按需組合用Predicate的重要性艰匙。簡而言之用Predicate和Lambda表達(dá)式的優(yōu)勢你可以寫的更少做得更多。

例6 Map和Reduce的例子

6.1 Map

在這個例子中抹恳,我們要將costBeforeTax的每個元素以加上他們的增值稅员凝。傳遞一個Lambda表達(dá)式給map方法使之應(yīng)用于每個元素,之后再用forEach打印結(jié)果奋献。

Java代碼

// Without lambda expressions:

List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);

for?(Integer cost : costBeforeTax) {

double?price = cost + .12*cost;

System.out.println(price);

}

// With Lambda expression:

List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);

costBeforeTax.stream().map((cost) -> cost + .12*cost).forEach(System.out::println);

輸出

112.0

224.0

336.0

448.0

560.0

112.0

224.0

336.0

448.0

560.0

6.2 Reduce

還有另外一個函數(shù)reduce可以將所有值轉(zhuǎn)換為一個值健霹。map跟reduce操作是函數(shù)式編程的核心,reduce也被稱作折疊操作瓶蚂。reduce并不是一種新的操作糖埋,在SQL中我們用的一些聚集函數(shù)比如sum,avg扬跋,count等他們實際上也是reduce操作阶捆,因為他們也是將多個值進(jìn)行操作然后返回一個值。Stream API定義了reduce函數(shù)钦听,可以接受一個Lambda表達(dá)式然后組合所有值洒试。Stream類中像IntStream都有內(nèi)置的方法像average(), count(), sum(), mapToLong(), mapToDouble()等轉(zhuǎn)換方法。我們可以用內(nèi)置的方法也可以自定義朴上。

Java代碼

// Old way:

List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);

double?total = 0;

for?(Integer cost : costBeforeTax) {

double?price = cost + .12*cost;

total = total + price;

}

System.out.println("Total : " + total);

// New way:

List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);

double?bill = costBeforeTax.stream().map((cost) -> cost + .12*cost).reduce((sum, cost) -> sum

+ cost).get();

System.out.println("Total : " + bill);

輸出

Total : 1680.0

Total : 1680.0

例7 用filter創(chuàng)建一個字符串List

在java開發(fā)中對大的集合進(jìn)行過濾是常用的操作垒棋。用Lambda表達(dá)式和Stream API會讓操作變得簡單易懂。

Stream提供了一個filter()方法痪宰,接受一個Predicate對象叼架。這意味著可以傳遞一個Lambda表達(dá)式作為過濾邏輯畔裕,看例子:

Java代碼

//創(chuàng)建一個長度大于兩個字符的字符串List

List<String> filtered = strList.stream().filter(x -> x.length()>

2).collect(Collectors.toList());

System.out.printf("Original List : %s, filtered list : %s %n", strList, filtered);

輸出 :

Original List : [abc, , bcd, , defg, jk], filtered list : [abc, bcd, defg]

例8 給每個List元素應(yīng)用函數(shù)

在工作中我們經(jīng)常會碰到這樣的情況:給List中每個元素加以一定的操作例如乘以或者除以某個值等。這些操作用map方法再好不過了乖订,我們可以將轉(zhuǎn)換邏輯以Lambda表達(dá)式傳給map方法來應(yīng)用于每個元素:

//將字符串轉(zhuǎn)為大寫然后用逗號連起來

Java代碼

List<String> G7 = Arrays.asList("USA", "Japan", "France", "Germany", "Italy","U.K.","Canada");

String G7Countries = G7.stream().map(x -> x.toUpperCase()).collect(Collectors.joining(", "));

System.out.println(G7Countries);

輸出:

USA, JAPAN, FRANCE, GERMANY, ITALY, U.K., CANADA

例9 復(fù)制不同值到子列表

本例演示如何利用Stream類的distinct方法過濾重復(fù)值到集合中扮饶。

Java代碼

List<Integer> numbers = Arrays.asList(9, 10, 3, 4, 7, 3, 4);

List<Integer> distinct = numbers.stream().map( i ->i*i).distinct().collect(Collectors.toList());

System.out.printf("Original List : %s, Square Without duplicates : %s %n", numbers, distinct);

輸出 :

Original List : [9, 10, 3, 4, 7, 3, 4], Square Without duplicates : [81, 100, 9, 16, 49]

例10 計算List中元素的最大,最小乍构,和以及平均值

在Stream類中像IntStream, LongStream and DoubleStream有一個非常有用的方法summaryStattics()甜无,返回IntSummaryStatistics, LongSummaryStatistics or DoubleSummaryStatistics其描述了這個流中元素的統(tǒng)計數(shù)據(jù)。下面的例子中我們用這個方法來計算一個List中的最大最小值總和以及均值:

Java代碼

List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);

IntSummaryStatistics stats = primes.stream().mapToInt((x) -> x).summaryStatistics();

System.out.println("Highest prime number in List : " + stats.getMax());

System.out.println("Lowest prime number in List : " + stats.getMin());

System.out.println("Sum of all prime numbers : " + stats.getSum());

System.out.println("Average of all prime numbers : " + stats.getAverage());

輸出:

Highest prime number in List : 29

Lowest prime number in List : 2

Sum of all prime numbers : 129

Average of all prime numbers : 12.9

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哥遮,一起剝皮案震驚了整個濱河市岂丘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌眠饮,老刑警劉巖奥帘,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異仪召,居然都是意外死亡寨蹋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門返咱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钥庇,“玉大人牍鞠,你說我怎么就攤上這事咖摹。” “怎么了难述?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵萤晴,是天一觀的道長。 經(jīng)常有香客問我胁后,道長店读,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任攀芯,我火速辦了婚禮屯断,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侣诺。我一直安慰自己殖演,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布年鸳。 她就那樣靜靜地躺著趴久,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搔确。 梳的紋絲不亂的頭發(fā)上彼棍,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天灭忠,我揣著相機(jī)與錄音,去河邊找鬼座硕。 笑死弛作,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的华匾。 我是一名探鬼主播缆蝉,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瘦真!你這毒婦竟也來了刊头?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤诸尽,失蹤者是張志新(化名)和其女友劉穎原杂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體您机,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡穿肄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了际看。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咸产。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖仲闽,靈堂內(nèi)的尸體忽然破棺而出脑溢,到底是詐尸還是另有隱情,我是刑警寧澤赖欣,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布屑彻,位于F島的核電站,受9級特大地震影響顶吮,放射性物質(zhì)發(fā)生泄漏社牲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一悴了、第九天 我趴在偏房一處隱蔽的房頂上張望搏恤。 院中可真熱鬧,春花似錦湃交、人聲如沸熟空。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痛阻。三九已至,卻和暖如春腮敌,著一層夾襖步出監(jiān)牢的瞬間阱当,已是汗流浹背俏扩。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留弊添,地道東北人录淡。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像油坝,于是被迫代替她去往敵國和親嫉戚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345