3 回答

TA貢獻1856條經(jīng)驗 獲得超5個贊
當您調(diào)用.filter(distinctByKey(Function.identity()))時,傳遞給的參數(shù)會filter()被評估。那是唯一一次distinctByKey(Function.identity())執(zhí)行并返回Predicate<String>.
然后對其進行多次評估(即執(zhí)行Predicate它的test()方法),每次針對Stream.
為了使您的最后一個代碼段的行為類似于Stream管道,它應該如下所示:
final Function<String,Integer> a = (name)->name.length();
Predicate<String> pred = distinctByKey(a);
System.out.println(pred.test("JOHN"));
System.out.println(pred.test("STEPHEN"));
System.out.println(pred.test("ORTIZ"));
System.out.println(pred.test("RONDON"));

TA貢獻1875條經(jīng)驗 獲得超5個贊
distinctByKey
返回緩存 的單個實例。例如,如果將通過 lambda 的創(chuàng)建替換為匿名內(nèi)部類,則可以獲得幾乎相同的結果。Predicate
ConcurrentHashMap
Predicate

TA貢獻1840條經(jīng)驗 獲得超5個贊
我認為 distinctByKey 方法在 Stream 的每次迭代中被調(diào)用或解釋,我的意思是 Map 在每個回合中都是實例,但事實并非如此!我的問題是 Predicate 方法的主體只調(diào)用一次?在 Stream 迭代中,這是一個斷言嗎?
不。Streams 不是魔法,它們不會推翻標準的 Java 語義??紤]提供的代碼:
final long d = Stream.of("JOHN","STEPHEN","ORTIZ","RONDON")
.filter(distinctByKey(Function.identity()))
.count();
從圖片中取出特定類型和方法,具有以下一般形式:
long x = A.b(y).c(z).d(w);
沒有理由期望 、 或 中的任何一個a()在b()該c()鏈中被多次調(diào)用,或者它們的參數(shù)每個都被計算多次。這不受某些類型的影響Stream。
相反,在您的情況下,您的方法Predicate返回的(唯一調(diào)用)在處理嵌入它的流時被多次使用。它包含對 a 的引用,它在執(zhí)行其工作時使用和修改它。distinctByKey()PredicateMap
添加回答
舉報