JavaRush /Java Blog /Random-TW /Lambda 和 Stream,只有實踐,沒有理論

Lambda 和 Stream,只有實踐,沒有理論

在 Random-TW 群組發布
大家好。值此比賽之際,我決定在這裡寫的不是一篇文章,而是簡短的課程。它將涉及 Java 中的 lambda 表達式和流。如果您已經熟悉並使用它們,請直接跳到本文末尾,您可以練習 JavaRush 的一小部分任務。你需要java 8以上,接受JR的培訓,會有很少的細節和很多看不懂的東西,想搞清楚的慾望很強烈。首先,我不會解釋 lambda 和流的出現歷史,只是我自己也不知道。我只知道它們是從函數式程式設計風格,到我們的OOP風格。在我短暫的學習經驗中,我簡單地展示瞭如何和什麼,有些人覺得很難理解這個想法,所以只要記住如何寫,稍後你就會明白。

拉姆達斯

Lambda 和流,只有實踐,沒有理論 - 1Lambda 和流,只有實踐,沒有理論 - 2如果你根本不知道什麼是 lambda,那麼: lambda 看起來像這樣:
(a, b) -> a.compareTo(b)
(переменные) -> действие
現在就足夠了。您可以在這裡閱讀理論:連結一連結二,但我認為實踐更有趣。我建議你解決以下問題:使用方法1寫一個計算器。該方法應該接受2個數字值和其他東西。您的程式碼將如下所示:
class Lambda{
    public static void main (String[] args) {
	}

    public static double calculate(){
       	return null;
    }
}
您需要在方法簽名中輸入3個參數calculate,在中加入1個命令return並在中測試呼叫方法main這個方法應該要能夠做些什麼?
  • 折疊;
  • 乘;
  • 劃分;
  • 減去;
  • 計算根;
  • 提升到一個冪;
  • 將參數總和除以第一個數字 + 117 求冪;
  • 以及您能想到的所有其他操作。
不應該使用什麼:
  • if-else;
  • char作為運行指標;
  • switch-case;
  • 以及您想到的所有其他內容。
你可以使用什麼:
  • 只有 lambda,任務就在他們身上。
- 什麼?這就是全部了嗎?- 是的,就是這樣,因為你實際上需要添加 3 行,如果我建議至少一行,其餘的將自動寫入。如果您願意,您可以透過谷歌搜尋範例並嘗試理解。當然,你會檢查自己,如果你作弊,沒有人會知道,但那為什麼呢?在解決了這樣一個簡單的問題後,我所有 1.5 年級的學生都粗略地了解了 lambda 是什麼以及如何使用它們。這對於串流媒體來說是非常必要的。如果您想炫耀結果並了解您是否做對了,請透過私人訊息發送代碼。無需評論;您可以在那裡添加有趣的提示(但不要使任務變得太容易)。同樣,解決了這個範例後,您應該已經對如何使用 lambda 有了大致的了解。
Lambda 和流,只有實踐,沒有理論 - 3
現在讓我們繼續討論 Java 流。作為讀者,您可能沒有想到這些流。不,不是inputStream,也不是OutputStream。這是不同的,它更有趣。流已經取代了循環,雖然不是完全,但仍然如此。他們的座右銘是「不要解釋如何做,而是解釋要做什麼」。流的一個小例子:
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList.stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);
這裡發生了什麼事?我們來新增評論:
myList.stream() // получить поток
    .filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
    .map(String::toUpperCase)  // преобразовать все значения, перевести в верхний регистр
    .sorted() // отсортировать по порядку (дефолтный порядо)
    .forEach(System.out::println); // вывести каждый элемент на экран
與常規循環比較:
List<String> toSort = new ArrayList<>();
for(String s : myList){
     if(s.startsWith("c")){
         toSort.add(s.toUpperCase());
     }
}

Collections.sort(toSort);

for(String s : toSort){
     System.ouy.println(s);
}
當你閱讀程式碼時,一切看起來都很可怕,但是有了註解是不是更容易?這很正常,我也很久沒聽懂。理解的關鍵是實踐。因此,我們開始閱讀第三方文章,尋找我們問題的答案,你也可以在評論中提問,我不會給出完整的答案,但我會指出方向。 我認為對於練習串流處理非常有用的 JavaRush 任務清單:
  • 2208 - 可以用 1 個流和 1 個返回來解決,即 該方法的主體將從 開始return,然後將有 1 個完整的流。讓我們忽略這個要求StringBuilder

  • 1908 - 你也可以用 1 個流和 1 個返回來解決它。從讀取文件開始。我不知道如何透過流記錄到文件(如果可能的話),而我們是手動進行的。那些。我們只打開 2 個流(控制台和寫入檔案)。我們透過方法讀取文件,這些方法將會傳回一個工作表或一個流(google 和 javadoc)。

  • 1907——理論上也可以一流解決。流的輸入是檔名,輸出是世界的字數。

就這樣。如果可以的話,我會再寫一個簡單的故事。在我看來,閱讀一些很酷的東西而沒有機會嘗試它在某種程度上是無聊的。在計算器和 3 個謎題之後,我認為您已經熟悉了 lambda 和流,所以如果您還沒有了解所有的可能性,請閱讀一下。更新:
  • 1016 - 用稍微變態的方式,可以1流1回解決;

  • 1821 - 非常簡單,1 次流,1 次返回。

    這兩個任務將向您介紹另一種流方法和另一種收集器。

  • 1925 - 你可以在一個流中獲取一​​行包含單字的內容,然後將其寫入文件(我不知道是否可以從流寫入文件)

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION