1. Java 8 的創新:函數式編程

隨著 Java 8 的發布,該語言獲得了對函數式編程的強大支持。您甚至可以說它獲得了期待已久的函數式編程支持。編碼變得更快,儘管代碼更難閱讀🙂

在學習Java函數式編程之前,我們建議您了解三件事:

  1. OOP、繼承和接口(Java 核心任務中的級別 1-2)。
  2. 接口中的默認方法實現
  3. 內部類匿名類

消息是您不必知道所有這些就可以使用 Java 中函數式編程的許多特性。壞消息是,如果不了解匿名內部類,將很難準確理解一切是如何安排的以及一切是如何工作的。

在接下來的課程中,我們將重點介紹使用 Java 的函數式編程功能是多麼容易和簡單,而無需深入了解其工作原理。

理解 Java 函數式編程的所有細微差別需要幾個月的時間。您可以在幾個小時內學會閱讀此類代碼。所以我們建議從小處著手。即使是 I/O 流。


2. I/O流:流管道

您還記得曾幾何時您學習過 I/O 流:InputStreamOutputStreamReader等等Writer嗎?

有從數據源讀取數據的流類,例如FileInputSteam,還有從其他流讀取數據的中間數據流,例如InputStreamReaderBufferedReader

這些流可以組織成數據處理管道。例如,像這樣:

FileInputStream input = new FileInputStream("c:\\readme.txt");
InputStreamReader reader = new InputStreamReader(input);
BufferedReader buff = new BufferedReader(reader);

String text = buff.readLine();

請務必注意,在前幾行代碼中,我們只是構建了一個Stream對象鏈。數據還沒有通過管道。

但是一旦我們調用該buff.readLine()方法,就會發生以下情況:

  1. 對象BufferedReader調用對像read()上的方法InputStreamReader
  2. 對象InputStreamReader調用對像read()上的方法FileInputStream
  3. 對像開始從文件中FileInputStream讀取數據

換句話說,在我們開始調用read()or之類的方法之前,數據不會沿著流管道移動readLine()。僅僅構建流管道並不能驅動數據通過它。流本身不存儲數據。他們只讀別人的書。

集合和流

從 Java 8 開始,可以使用流從集合中讀取數據(而不僅僅是從集合中讀取數據)。但這還不是最有趣的事情。實際上,輕鬆簡單地構建複雜的數據流鏈成為可能。這樣做,以前需要 5-10 行的代碼現在可以用 1-2 行編寫。

在字符串列表中查找最長字符串的示例:

尋找最長的字符串
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String max = list.stream().max((s1, s2)-> s1.length()-s2.length()).get();
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
Optional<String> optional = stream.max((s1, s2)-> s1.length()-s2.length());
String max = optional.get();

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>創建對象時不會移動任何數據。為了開始構建流管道,我們只是簡單地獲取了一個流對象。