摘要:依舊使用剛剛對蘋果排序的代碼。現在,要做的是篩選出所有的綠蘋果,也許你會這一個這樣的方法在之前,基本上都是這樣寫的,看起來也沒什么毛病。但是,現在又要篩選一下重量超過克的蘋果。
《Java8實戰》-讀書筆記第一章(01)
最近一直想寫點什么東西,卻不知該怎么寫,所以就寫寫關于看《Java8實戰》的筆記吧。
第一章內容較多,因此打算分幾篇文章來寫。
為什么要關心Java8自1996年JDK(1.0)發布以來,Java已經受到了學生、項目經理和 程序員等一大批活躍的用戶的歡迎。這一語言極富活力,不斷被用在大大小小的項目里。從Java1.1(1997)年一直到Java7(2011)年,Java通過增加新功能,不斷得到良好的升級。Java8則是在2014年3月發布的。那么問題來了:為什么你應該關心Java8?
是的,Java一直被吐槽寫起來太啰嗦,沒有IDE的快捷鍵和自動生成,簡直就是在用生命寫代碼,因為太浪費時間。
例如,最簡單的HelloWorld:
public class HelloWorld { public static void main (String[] args) { System.out.println("HelloWorld"); } }
都要這寫么多代碼,不使用快捷鍵或者語法模板去生成,真的很浪費時間。(初學者請忽略)
所以,為了解決這個問題,Java8中推出了核心新特性之一:Lambda(匿名函數)
Lambda表達式,是一個很不錯很實用的一個新特性,如果你使用了這個新特性,也許會愛不釋手。
舉個例子,比如我們對蘋果進行按照重量進行排序,也許我們會這樣寫:
private static Listapples = Arrays.asList(new Apple(100, "red"), new Apple(101, "green"), new Apple(132, "green"), new Apple(90, "green"), new Apple(122, "red") );
Collections.sort(apples, new Comparator() { public int compare(Apple o1, Apple o2) { return o1.getWeight() < o2.getWeight() ? -1 : ((o1.getWeight() == o2.getWeight()) ? 0 : 1); } });
在Java8里,你可以這樣寫,這樣寫看起來更接近問題的描述:
apples.sort(Comparator.comparing(Apple::getWeight));
是不是有點心動啊,本來需要五六行解決的排序的代碼,現在只要一行即可!趁熱打鐵,繼續吧。
Java8里面將代碼傳遞給方法的功能(同時也能夠放回代碼并將其包含在數據結構中),還讓我們能夠使用一整套技巧,通常稱為函數式編程。
現在你需要篩選一個目錄中的所有隱藏文件,你會怎么做?
大部分人立馬會想到,File類中不就是有一個isHidden的方法嗎?使用這個方法就可以判斷哪些是隱藏文件啦。
是的,如下所示:
File[] files = new File("D:.").listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isHidden(); } });
看起來很簡單,很明了嘛!那還可以不可以繼續優化簡短一下呢?答案是當然可以的。
如下所示:
File[] files = new File("D:.").listFiles(File::isHidden);
太酷了,有了函數isHidden,因此只需要使用Java8的方法引用語法::(即“把這個方法作為值”)將其傳給listFiles方法就可以了。
代碼傳遞:一個例子來看看一個例子,看看它是如何幫你你寫程序的。依舊使用剛剛對蘋果排序的代碼。現在,要做的是篩選出所有的綠蘋果,也許你會這一個這樣的方法filterGreenApples:
public static ListfilterGreenApples(List apples) { List result = new ArrayList<>(); for (Apple apple : apples) { if ("green".equals(apple.getColor())) { result.add(apple); } } return result; }
在Java8之前,基本上都是這樣寫的,看起來也沒什么毛病。但是,現在又要篩選一下重量超過120克的蘋果。哦,一想很簡單嘛,把上面的代碼復制、粘貼改一下就好啦:
public static ListfilterHeavyApples(List apples) { List result = new ArrayList<>(); for (Apple apple : apples) { if (apple.getWeight() > 120) { result.add(apple); } } return result; }
雖然簡單,但是還是出現了一些重復地方,看起來不太好。這兩段代碼的差異只是條件不同,那么只需要把接受重量的上下限作為參數傳遞給filter就可以了,使用Java8來優化一下這些代碼:
public static void main (String[] args) { // 篩選出綠色蘋果 ListgreenApples = filterApples(apples, FilterApples::isGreenApple); System.out.println(greenApples); // 篩選重量大于120克的蘋果 List heavyApples = filterApples(apples, FilterApples::isHeavyApple); System.out.println(heavyApples); } public static boolean isGreenApple(Apple apple) { return "green".equals(apple.getColor()); } public static boolean isHeavyApple(Apple apple) { return apple.getWeight() > 120; } public static List filterApples(List apples, Predicate predicate) { List result = new ArrayList<>(); for (Apple apple : apples) { if (predicate.test(apple)) { result.add(apple); } } return result; } interface Predicate { /** * 根據給定的參數計算此謂詞 * * @param t * @return */ boolean test(T t); }
在這段代碼中,自定義了一個接口Predicate
前面的代碼傳遞了方法Apple::isGreenApple(它接受參數Apple并返回一個boolean)給filterApples。后者希望接受一個Predicate
當然,Java8中已經有了一個Predicate
使用自定義的Predicate接口中的方法,你創建了一個方法引用,你無須去關注test方法是如何實現的,你只要知道你引用的某個方法即可。
讀書筆記系列的文章,因為我的文筆不是很好,一些觀點可能描述的不是那么的好,文章中有誤的地方還請各位讀者指正,非常感謝。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76598.html
摘要:實戰讀書筆記第一章從方法傳遞到接著上次的,繼續來了解一下,如果繼續簡化代碼。去掉并且生成的數字是萬,所消耗的時間循序流并行流至于為什么有時候并行流效率比循序流還低,這個以后的文章會解釋。 《Java8實戰》-讀書筆記第一章(02) 從方法傳遞到Lambda 接著上次的Predicate,繼續來了解一下,如果繼續簡化代碼。 把方法作為值來傳遞雖然很有用,但是要是有很多類似與isHeavy...
摘要:之前,使用匿名類給蘋果排序的代碼是的,這段代碼看上去并不是那么的清晰明了,使用表達式改進后或者是不得不承認,代碼看起來跟清晰了。這是由泛型接口內部實現方式造成的。 # Lambda表達式在《Java8實戰》中第三章主要講的是Lambda表達式,在上一章節的筆記中我們利用了行為參數化來因對不斷變化的需求,最后我們也使用到了Lambda,通過表達式為我們簡化了很多代碼從而極大地提高了我們的...
摘要:收集器用作高級歸約剛剛的結論又引出了優秀的函數式設計的另一個好處更易復合和重用。更具體地說,對流調用方法將對流中的元素觸發一個歸約操作由來參數化。另一個常見的返回單個值的歸約操作是對流中對象的一個數值字段求和。 用流收集數據 我們在前一章中學到,流可以用類似于數據庫的操作幫助你處理集合。你可以把Java 8的流看作花哨又懶惰的數據集迭代器。它們支持兩種類型的操作:中間操作(如 filt...
摘要:跳過元素流還支持方法,返回一個扔掉了前個元素的流。歸約到目前為止,我們見到過的終端操作都是返回一個之類的或對象等。這樣的查詢可以被歸類為歸約操作將流歸約成一個值。通過反復使用加法,你把一個數字列表歸約成了一個數字。 使用流 在上一篇的讀書筆記中,我們已經看到了流讓你從外部迭代轉向內部迭代。這樣,你就用不著寫下面這樣的代碼來顯式地管理數據集合的迭代(外部迭代)了: /** * 菜單 ...
摘要:但是到了第二天,他突然告訴你其實我還想找出所有重量超過克的蘋果。現在,農民要求需要篩選紅蘋果。那么,我們就可以根據條件創建一個類并且實現通過謂詞篩選紅蘋果并且是重蘋果酷,現在方法的行為已經取決于通過對象來實現了。 通過行為參數化傳遞代碼 行為參數化 在《Java8實戰》第二章主要介紹的是通過行為參數化傳遞代碼,那么就來了解一下什么是行為參數化吧。 在軟件工程中,一個從所周知的問題就是,...
閱讀 2298·2021-11-24 09:38
閱讀 2061·2021-11-22 14:44
閱讀 1156·2021-07-29 13:48
閱讀 2621·2019-08-29 13:20
閱讀 1119·2019-08-29 11:08
閱讀 2058·2019-08-26 10:58
閱讀 1266·2019-08-26 10:55
閱讀 3159·2019-08-26 10:39