[英]How does anyMatch work in java stream in this example
這是我的代碼:
Stream.of("d2", "a2", "b1", "b3", "c")
.map(s -> {
System.out.println("map: " + s);
return s.toUpperCase();
})
.anyMatch(s -> {
System.out.println("anyMatch: " + s);
return ((String) s).startsWith("A");
});
output 是:
map: d2
anyMatch: D2
map: a2
anyMatch: A2
我的問題是為什么第一個元素進入 stream 而第三個和第四個沒有?
任何詳細的解釋表示贊賞。
從javadoc的文本:
返回此 stream 的任何元素是否與提供的謂詞匹配。 如果不需要確定結果,則可能不會評估所有元素的謂詞。 如果 stream 為空,則返回 false 並且不評估謂詞。
這是一個短路操作,在遇到該元素時結果為真。
如果要處理每個項目,請使用forEach
。
您的代碼相當於:
for (String s : new String[] {"d2", "a2", "b1", "b3", "c"}) {
System.out.println("map: " + s);
s = s.toUpperCase();
System.out.println("anyMatch: " + s);
if (((String) s).startsWith("A"))
break;
}
"a2"
之后的元素因為break
語句而沒有被處理。 這被稱為短路,即它在到達末端之前斷開循環(電路)(在末端附近停止)。
anyMatch(...)
方法被記錄為短路:
這是一個短路終端操作。
該鏈接導致此解釋:
此外,一些操作被認為是短路操作。 如果在出現無限輸入時,中間操作可能會產生有限的 stream,則它是短路的。 如果一個終端操作在有無限輸入時可能會在有限時間內終止,那么它就是短路的。 在流水線中進行短路操作是無限 stream 處理在有限時間內正常終止的必要條件,但不是充分條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.