[英]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.