JavaRush /Java Blog /Random-TW /非簡單簡單流程
Oleg Savenko
等級 41
Одесса

非簡單簡單流程

在 Random-TW 群組發布
Java 的每個新版本都變得越來越豐富。雖然大部分豐富性都存在於早期版本中,但語言在方法論和實作方面都在不斷改進。Java 中的集合也不例外。 核心集合框架出現在 J2SE 1.2 中,並繼續發展,所經歷的變化令人愉悅而不是令人失望。隨著 JDK 5 的發布,集合變得更加方便、更快、更容易使用。這導致程式設計師開始更集中地利用它們。已經發展出一些與它們一起工作的模式,這無疑是有效的。但在 JDK 8 中,集合再次變得更好,並且得益於線程,它們變得更好。顯然,由於集合可以以流的形式表示,因此使用它們的方法也會發生變化。因此,我想展示熟悉且易於理解的集合解決方案如何變得更加簡單。

範例 1. 再簡單不過了

當然,我們從最簡單的開始,遍歷集合的所有元素,並顯示所有元素。
// создадим и заполним список
   List<Integer> list = new ArrayList<>();
   Collections.addAll(list, 1, 5, 6, 11, 3, 15, 7, 8);
   // а теперь
   // быстрый for по всем elementм, только для коллекций
   for (Integer i:list){
       System.out.println(i);
   }
   //но мы уже живем в JDK 8
   //а значит нужно так
   list.stream().forEach(System.out::println);
正如您所注意到的,作為 Java 新手,我認為有一種新語法要簡單得多。那麼,新語法中可見的內容是:
берем_список(list).превращаем_в_поток(stream).перебираем_все_элементы(forEach)(тут_интуитивно_понятно)
System.out::println— 指向將字串輸出到控制台的靜態方法的連結 您可以使用稍微不同、不太清晰的條目,而不是指向靜態方法的連結:
list.stream().forEach(i -> System.out.println(i));
此條目使用 lambda 表達式。是的,要學習如何使用流,您需要學習 lambda 表達式 - 它們非常棒。此外,我不會展示如何僅使用流來處理集合,因為您在課程中已經熟悉了傳統方法。

範例2.在清單中尋找偶數值並將其顯示在控制台中

list.stream().filter(i -> i%2==0).forEach(System.out::println);
整個問題一口氣解決了。我希望你喜歡在一條線上工作。使用該方法,filter我們過濾了流並將剩餘的內容輸出到控制台。過濾器是一個非常強大的東西,可以在最意想不到的情況下提供幫助。讓我們發揮創意並改變問題的條件。例如,我們需要計算列表中有多少個偶數:
long count = list.stream().filter(i -> i%2==0).count();
又排成一列。不知何故,一切似乎都很簡單。在過濾器中,我們使用了 lambda 表達式,從而僅將偶數放入新流中,然後應用於新流count,計算新流中有多少個元素。

範例 3. 讓我們計算一下列表中有多少個單字長度為 5 個字符

我們已經玩過整數了,現在就讓我們來玩一下單字吧。
List<String> list = new ArrayList<>();
Collections.addAll(list, "разые", "слова", "интересные", "And", "Not", "Very");

System.out.println(list.stream().filter(w -> w.length() == 5).count());
我們再次使用過濾器。在過濾器中,使用 lambda 表達式顯示一個新流,然後,可以理解的是,count我計算了新流中有多少元素。

範例 4. 列印唯一單字

當我們從文件中將許多不同的單字讀入集合中時,這是一個熟悉的任務,而現在我們只需要唯一的單字。
List<String> list = new ArrayList<>();
Collections.addAll(list, "Vasya", "Таня", "Olya", "Vasya", "Olya", "Сергей");

list.stream().distinct().forEach(System.out::println);
主要操作是使用在流上完成的distinct。接下來,我建議使用線程來查看課程中的一些任務

範例 5. 長單字

Java核心第9級,第11講有一個有趣的問題,就是你需要在File2中寫出以逗號分隔的單詞,其長度嚴格大於6。無論你圍欄的是哪種花園,我提出以下解決方案:
  1. 從來源檔案中,我們將所有單字讀入清單中。

  2. 然後我們執行以下行

    Optional<String> rezult = list.stream()
    				.filter(w->w.length()>6)
    				.reduce((w1,w2)->w1+", "+w2);
  3. result.get()寫入檔案。

這是一個使用線程的有趣解決方案。過濾器進行過濾,並使用reduce和正規表示式,產生所需的字串。

範例 6. 帶數字的單字

在 File2 中寫入所有包含數字的單詞,例如 a1 或 abc3d,並以空格分隔。這也是我們習題冊上的條件,如你猜的,解決方法很簡單。
Optional<String> rezult = list.stream()
				.filter(w->w.matches(".*?\\d+.*?"))
				.reduce((w1,w2)->w1+" "+w2);
我們使用正規表示式過濾流,然後使用reduce 和lambda 表達式。與之前的任務有許多共同點。

範例 7. 選擇數字

整個任務聽起來是這樣的:
  • 從控制台讀取2個檔案名稱。
  • 將第一個文件中的所有數字輸出到第二個文件中。
  • 數字之間以空格分隔。
  • 關閉溪流。
對於主要任務,即將數字寫入以空格分隔的字串中,為了進一步寫入文件,我建議使用流,它將如下所示:
Optional<String> rezult = list.stream().filter(w->w.matches("\\d+"))
				.reduce((w1,w2)->w1+" "+w2);
System.out.println(rezult.get());
使用線程,問題就以非常簡單的方式解決了。但是,您瞧,請將此解決方案與先前的兩個解決方案進行比較。在文章結束時,我想向你們坦白:夥計們,我在選擇範例時作弊了。事實上,我選擇了最簡單的例子,以便用熟悉的問題向您展示一個不熟悉的主題。當然,執行緒既可用於簡單任務,也可用於更複雜的任務。但正如霍斯特曼在他的書中所強調的那樣,“數據流的運作原則是‘做什麼,而不是如何做’”,這意味著許多以前複雜的任務可以變得更簡單。我不了解你,但我喜歡這些流程,我希望我沒有阻止你學習它們。讓我再解釋一件事:
  1. 我並不是要教讀者如何在集合中使用流;我不是一位經驗豐富的老師。我想向您展示線程是簡單且非常有趣的!一般來說,這是必要的。
  2. 我對流了解得越多,我看到的問題就越多,它們解決了課本上的所有問題,這意味著流不是白發明的。
  3. 串流不僅易於使用,而且還具有一個重要的優勢 - 在處理大量資料時,串流通常更有效率。
附言。我對所有問題都開玩笑。 推薦:專業Java庫。第 2 卷 進階程式設計工具。凱‧霍斯特曼。我有第十版。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION