《Java8 實戰(zhàn)》- 讀書筆記第一章(02)

《Java8 實戰(zhàn)》- 讀書筆記第一章(02)

2018-12-29 22:56 folder Java label Java8

從方法傳遞到 Lambda

接著上次的 Predicate讹剔,繼續(xù)來了解一下挎春,如果繼續(xù)簡化代碼江掩。

把方法作為值來傳遞雖然很有用甩卓,但是要是有很多類似與 isHeavyApple 和 isGreenApple 這種可能只用一兩次的方法定義一堆確實有點(diǎn)煩人。為了解決這個問題蹄梢,Java8 它引入了一套新記法(匿名函數(shù)或 Lambda)恃锉,然你可以這樣寫:

List<Apple> isRedApples = filterApples(FilteringApples.apples, apple -> "red".equals(apple.getColor()));

或者是:

List<Apple> appleList = filterApples(FilteringApples.apples, apple -> apple.getWeight() < 120                && "red".equals(apple.getColor()));

甚至隔盛,你都可以不需要使用 filterApples 這個方法了,直接使用 Stream 中的 filter 方法就可以解決了:

List<Apple> isGreenApple = apples.stream().filter(apple -> "green".equals(apple.getColor()))                .collect(Collectors.toList());

酷朗儒,看起來很不錯颊乘。所以,你甚至都不需要為只用一次的方法寫定義醉锄;這樣的代碼看起來更簡潔乏悄、更清晰,因為你用不著去找自己到底傳遞了什么代碼恳不。

在剛剛篩選蘋果的過程中檩小,就有使用到 Stream(流)其中的一個方法,這個 Stream 和 InputStream烟勋、OutputStream 是兩個完全不同的東西规求。Stream 它是 Java8 中的一個核心新特,它是一套新的用來處理集合的 API卵惦,有很多類似與 filter 這樣的方法而且使用起來非常的簡單和簡潔阻肿,可以簡化大部分代碼并且在并行的情況下利用多核 CPU,能很有效的提升對集合處理的性能鸵荠。

本章只是簡單的介紹了一下流的使用方式冕茅,至于流的詳細(xì)用法后面的章節(jié)會提到的。

現(xiàn)在蛹找,有一串字符串姨伤,需要進(jìn)行篩選并且轉(zhuǎn)為大寫以進(jìn)行排序,在 Java8 之前是我們是這么干的:

List<String> stringList = Arrays.asList("a1", "a2", "b1", "c1", "c2", "c4", "c3");List<String> cList = new ArrayList<>();for (String s : stringList) {    // 篩選出以c開頭的字符串    if (s.startsWith("c")) {        // 將以c開頭的字符串轉(zhuǎn)為大寫庸疾,添加到集合        cList.add(s.toUpperCase());    }}// 排序Collections.sort(cList);// 遍歷打印for (String s : cList) {    System.out.println(s);}

這樣的代碼看起來很頭疼乍楚,需要寫這么長一段的代碼,在 Java8 中可以使用 Stream 進(jìn)行優(yōu)化:

List<String> stringList = Arrays.asList("a1", "a2", "b1", "c1", "c2", "c4", "c3");stringList.stream()        // 篩選出以c開頭的字符串        .filter(s -> s.startsWith("c"))        // 將剛剛以c開頭的字符串轉(zhuǎn)為大寫        .map(String::toUpperCase)        // 排序        .sorted()        // 循環(huán)遍歷        .forEach(System.out::println);

太棒了届慈,只需要短短的一行代碼就可以完成徒溪!但是,使用 Stream 它也是有缺點(diǎn)的金顿,它的性能不如 foreach 的效率高為了解決這個問題臊泌,Stream 支持并。使用并行能極大的利用多核 CPU 的優(yōu)勢揍拆,例如說:這些代碼原本只是用單核進(jìn)行處理渠概,現(xiàn)在有一臺 8 核的 CPU 電腦,那么它的處理速度就會是單核的八倍。

我們來進(jìn)行比較一下播揪,生成一個 0-100 的數(shù)字并寫入到文件中贮喧,循序流 VS 并行流誰的效率更高.

循序流:

long startTime = System.currentTimeMillis();OutputStream out = new FileOutputStream(new File("D:/integer1.txt"));IntStream.rangeClosed(0, 100)        .forEach(i -> {            try {                Thread.sleep(100L);                out.write(i);            } catch (IOException | InterruptedException e) {                e.printStackTrace();            }        });long endTime = System.currentTimeMillis();System.out.println("循序流:" + (endTime - startTime));

并行流:

long startTime = System.currentTimeMillis();OutputStream out = new FileOutputStream(new File("D:/integer2.txt"));IntStream.rangeClosed(0, 100)        .parallel().forEach(i -> {    try {        Thread.sleep(100L);        out.write(i);    } catch (IOException | InterruptedException e) {        e.printStackTrace();    }});long endTime = System.currentTimeMillis();System.out.println("并行流:" + (endTime - startTime));

執(zhí)行結(jié)果(I5-6200U 的筆記本上執(zhí)行結(jié)果):

循序流:10251并行流:2620

效率明顯要比循序流快很多嘛!但是猪狈,并行流并不是萬能的箱沦,如果把 sleep 去掉后并且數(shù)字加到 100 萬,你會發(fā)現(xiàn)運(yùn)行的時間比循序流還要長雇庙。

去掉 sleep 并且生成的數(shù)字是 0-100 萬谓形,所消耗的時間:

循序流:2775并行流:3346

至于為什么有時候并行流效率比循序流還低,這個以后的文章會解釋疆前。

默認(rèn)方法

默認(rèn)方法是 Java8 中的一個新特性套耕,它的出現(xiàn)使得接口的升級變得平滑了,因為子類不是必須再去顯示的實現(xiàn)接口中的方法了峡继。

例如:在 Java8 中冯袍,你可以直接調(diào)用 List 接口中的 sort 方法、它是用 Java8 List 接口中如下所示的默認(rèn)方法實現(xiàn)的:

default void sort(Comparator<? super E> c) {    Object[] a = this.toArray();    Arrays.sort(a, (Comparator) c);    ListIterator<E> i = this.listIterator();    for (Object e : a) {        i.next();        i.set((E) e);    }}

這意味著 List 的任何實體類都不需要顯示的實現(xiàn) sort碾牌,而在以前的 Java 版本中康愤,除非提供了 sort 的實現(xiàn),否則這些實體類都無法編譯通過舶吗。但是征冷,默認(rèn)方法也存在著一些問題,一個類可以實現(xiàn)多個接口誓琼,那么好幾個接口多有同樣的默認(rèn)方法检激,那么這是否意味著 Java 中有了某種形式的多繼承?如果是多繼承腹侣,那么會不會出現(xiàn)像 C++ 中菱形繼承的問題叔收?這些問題以后的文章中都會有解釋和解決方案。

第一章總結(jié):

  1. 了解了 Java8 中的一些核心新特性傲隶,例如:Lambda 表達(dá)式饺律、Stream、默認(rèn)方法跺株。
  2. 了解了 Lambda 表達(dá)式和 Stream 為代碼帶來的簡潔性复濒。
  3. 并行流帶來的好處。
  4. Java8 中的默認(rèn)方法帶來的好處乒省。

代碼案例:Github-https://github.com/NGLSL/Java8InAction-ReadingNotes.git

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巧颈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子袖扛,更是在濱河造成了極大的恐慌砸泛,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晾嘶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)娶吞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門垒迂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人妒蛇,你說我怎么就攤上這事机断。” “怎么了绣夺?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵吏奸,是天一觀的道長。 經(jīng)常有香客問我陶耍,道長奋蔚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任烈钞,我火速辦了婚禮泊碑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘毯欣。我一直安慰自己馒过,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布酗钞。 她就那樣靜靜地躺著腹忽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砚作。 梳的紋絲不亂的頭發(fā)上窘奏,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機(jī)與錄音葫录,去河邊找鬼蔼夜。 笑死,一個胖子當(dāng)著我的面吹牛压昼,可吹牛的內(nèi)容都是我干的求冷。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼窍霞,長吁一口氣:“原來是場噩夢啊……” “哼匠题!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起但金,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤韭山,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钱磅,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梦裂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盖淡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片年柠。...
    茶點(diǎn)故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖褪迟,靈堂內(nèi)的尸體忽然破棺而出冗恨,到底是詐尸還是另有隱情,我是刑警寧澤味赃,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布掀抹,位于F島的核電站,受9級特大地震影響心俗,放射性物質(zhì)發(fā)生泄漏傲武。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一城榛、第九天 我趴在偏房一處隱蔽的房頂上張望谱轨。 院中可真熱鬧,春花似錦吠谢、人聲如沸土童。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽献汗。三九已至,卻和暖如春王污,著一層夾襖步出監(jiān)牢的瞬間罢吃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工昭齐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尿招,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓阱驾,卻偏偏與公主長得像就谜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子里覆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容