第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用方法體的 Java 8 謂詞只被調(diào)用一次?

使用方法體的 Java 8 謂詞只被調(diào)用一次?

繁星淼淼 2022-12-15 16:33:52
我檢查了以下片段:public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {    Map<Object, Boolean> computed = new ConcurrentHashMap<>();/*IS THIS LINE CALLED ONCE ON STREAM->FILTER NOT MATTER HOW LONG THE STREAM IS*/    return t -> {return computed.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;};}private void test(){    final long d = Stream.of("JOHN","STEPHEN","ORTIZ","RONDON")            .filter(distinctByKey(Function.identity()))            .count();    System.out.println("d = " + d);}這段代碼不是我的。我知道在這個例子中使用 aConcurrentMap不是正確的選擇,在這種情況下我應該使用ConcurrentMap而不是Map,但這不是我現(xiàn)在關心的問題。我認為distinctByKey在每次迭代中調(diào)用或解釋該方法Stream。我的意思Map是在每一輪都被實例化,但事實并非如此!方法體Predicate只調(diào)用一次嗎?在Stream迭代中,這是一個斷言嗎?因為當我嘗試以下代碼時:final Function<String,Integer>a = (name)->name.length();System.out.println(distinctByKey(a).test("JOHN"));System.out.println(distinctByKey(a).test("STEPHEN"));System.out.println(distinctByKey(a).test("ORTIZ"));System.out.println(distinctByKey(a).test("RONDON"));我可以看到方法的主體確實在每一行中都被調(diào)用了。是什么讓過濾器的主體只被調(diào)用一次?
查看完整描述

3 回答

?
RISEBY

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"));


查看完整回答
反對 回復 2022-12-15
?
慕田峪4524236

TA貢獻1875條經(jīng)驗 獲得超5個贊

distinctByKey返回緩存 的單個實例。例如,如果將通過 lambda 的創(chuàng)建替換為匿名內(nèi)部類,則可以獲得幾乎相同的結果。PredicateConcurrentHashMapPredicate



查看完整回答
反對 回復 2022-12-15
?
慕斯709654

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


查看完整回答
反對 回復 2022-12-15
  • 3 回答
  • 0 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號