1. Java 8 的創新:函數式編程
隨著 Java 8 的發布,該語言獲得了對函數式編程的強大支持。您甚至可以說它獲得了期待已久的函數式編程支持。編碼變得更快,儘管代碼更難閱讀🙂
在學習Java函數式編程之前,我們建議您了解三件事:
- OOP、繼承和接口(Java 核心任務中的級別 1-2)。
- 接口中的默認方法實現。
- 內部類和匿名類。
好消息是您不必知道所有這些就可以使用 Java 中函數式編程的許多特性。壞消息是,如果不了解匿名內部類,將很難準確理解一切是如何安排的以及一切是如何工作的。
在接下來的課程中,我們將重點介紹使用 Java 的函數式編程功能是多麼容易和簡單,而無需深入了解其工作原理。
理解 Java 函數式編程的所有細微差別需要幾個月的時間。您可以在幾個小時內學會閱讀此類代碼。所以我們建議從小處著手。即使是 I/O 流。
2. I/O流:流管道
您還記得曾幾何時您學習過 I/O 流:InputStream
、OutputStream
、Reader
等等Writer
嗎?
有從數據源讀取數據的流類,例如FileInputSteam
,還有從其他流讀取數據的中間數據流,例如InputStreamReader
和BufferedReader
。
這些流可以組織成數據處理管道。例如,像這樣:
FileInputStream input = new FileInputStream("c:\\readme.txt");
InputStreamReader reader = new InputStreamReader(input);
BufferedReader buff = new BufferedReader(reader);
String text = buff.readLine();
請務必注意,在前幾行代碼中,我們只是構建了一個Stream
對象鏈。數據還沒有通過管道。
但是一旦我們調用該buff.readLine()
方法,就會發生以下情況:
- 對象
BufferedReader
調用對像read()
上的方法InputStreamReader
- 對象
InputStreamReader
調用對像read()
上的方法FileInputStream
- 對像開始從文件中
FileInputStream
讀取數據
換句話說,在我們開始調用read()
or之類的方法之前,數據不會沿著流管道移動readLine()
。僅僅構建流管道並不能驅動數據通過它。流本身不存儲數據。他們只讀別人的書。
集合和流
從 Java 8 開始,可以使用流從集合中讀取數據(而不僅僅是從集合中讀取數據)。但這還不是最有趣的事情。實際上,輕鬆簡單地構建複雜的數據流鏈成為可能。這樣做,以前需要 5-10 行的代碼現在可以用 1-2 行編寫。
在字符串列表中查找最長字符串的示例:
尋找最長的字符串 |
---|
|
|
3.Stream
界面
Java 8 對流的擴展支持是使用Stream<T>
接口實現的,其中T
是一個類型參數,表示流中傳遞的數據類型。換句話說,流完全獨立於它傳遞的數據類型。
要從集合中獲取流對象,只需調用其stream()
方法即可。代碼大致如下所示:
Stream<Type> name = collection.stream();
在這種情況下,集合將被視為流的數據源,對象Stream<Type>
將是一個以數據流的形式從集合中獲取數據的工具。
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
順便說一句,您不僅可以從集合中獲取流,還可以從數組中獲取流。為此,您需要使用該方法。例如:Arrays.stream()
Stream<Type> name = Arrays.stream(array);
在這種情況下,數組將被視為名為 的流的數據源name
。
Integer[] array = {1, 2, 3};
Stream<Integer> stream = Arrays.stream(array);
Stream<Type>
創建對象時不會移動任何數據。為了開始構建流管道,我們只是簡單地獲取了一個流對象。
GO TO FULL VERSION