簡體   English   中英

Java 8 - 懶惰評估?

[英]Java 8 - Lazy Evaluation?

當我發現自己對Streams API如何對循環方法的命令性進行懶惰評估感到困惑時,我正在瀏覽Streams Video。

這是典型的for循環代碼,它檢查第一個大於3的數字,然后,它只是打印並返回。

List<Integer> arr = Arrays.asList(1, 2, 3, 5, 4, 6, 7, 8, 9);

    for (int i : arr) {
        System.out.println(" Checking if is Greater: " + i);
        if (i > 3) {
            System.out.println("checking if is Even " + i);
            if (i % 2 == 0) {
                System.out.println(i * 2);
                break;
            }
        }
    }

這里是預期的輸出:

Checking if is Greater: 1
Checking if is Greater: 2
Checking if is Greater: 3
Checking if is Greater: 5
Checking if is Even 5
Checking if is Greater: 4
Checking if is Even 4
8

現在使用Streams API的代碼相同:

arr.stream()
       .filter(Lazy::isGreater)
       .filter(Lazy::isEven)
       .map(Lazy::doubleIt)
       .findFirst();

它也以同樣的方式評估。 那么filter()如何提供一些我們用傳統的for循環無法獲得的東西呢?

這是關鍵: 可組合性

arr.stream()
       .filter(Lazy::isGreater)
       .filter(Lazy::isEven)
       .map(Lazy::doubleIt)
       .findFirst();

這似乎是無害的,但現在這是一個價值:

 arr.stream()
       .filter(Lazy::isGreater)

您可以將其交給方法並在其上構建。

什么可以用等效的循環? 您可以在任何使用它的地方復制粘貼它。 它不是一個可組合的抽象。

此外,Stream還提供了如何迭代和處理數據摘要。 它可以使用工作池或fork連接,也可以按順序執行CPU緩存本地或任何數量的事情。 你不再告訴JVM如何做一些你正在接近告訴它該做什么並讓它弄清楚如何做的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM