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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

BiFunction - apply 方法應(yīng)該總是返回第二個(gè)參數(shù)。為什么?

BiFunction - apply 方法應(yīng)該總是返回第二個(gè)參數(shù)。為什么?

子衿沉夜 2023-05-10 13:49:10
我正在嘗試從其前身大于其價(jià)值的列表中識(shí)別數(shù)字。在 lambda 表達(dá)式中,如果我返回 b,它的行為符合預(yù)期,但如果我返回 a,它會(huì)給出錯(cuò)誤的輸出。這兩個(gè) return 語句有什么區(qū)別?    List<Integer> list = Arrays.asList(1,2,3,4,5,8,7);    List<Integer> result = new ArrayList<>();    list.stream().reduce((a,b) -> {if (a < b) result.add(a);return b;});    System.out.println(result);    result.clear();    list.stream().reduce((a,b) -> {if (a < b) result.add(a);return a;});    System.out.println(result);輸出:[1, 2, 3, 4, 5][1, 1, 1, 1, 1, 1]
查看完整描述

2 回答

?
白衣非少年

TA貢獻(xiàn)1155條經(jīng)驗(yàn) 獲得超0個(gè)贊

您正在執(zhí)行的減少 - 使用Optional<T> java.util.stream.Stream.reduce(BinaryOperator<T> accumulator)- 等效于以下偽代碼(取自 Javadoc):


boolean foundAny = false;

T result = null;

for (T element : this stream) {

    if (!foundAny) {

        foundAny = true;

        result = element;

    } else {

        result = accumulator.apply(result, element);

    }

}

return foundAny ? Optional.of(result) : Optional.empty();

如您所見,歸約result的中間值作為累加器的第一個(gè)參數(shù)傳遞,當(dāng)前element的Stream作為第二個(gè)參數(shù)傳遞。


因此,當(dāng)您的 lambda 表達(dá)式返回第二個(gè)參數(shù)b(第一個(gè)片段)時(shí),中間結(jié)果成為 的當(dāng)前元素,您將在下一次迭代中將Stream其添加到。List


當(dāng)您的 lambda 返回第一個(gè)參數(shù)a(第二個(gè)片段)時(shí),中間結(jié)果保持不變(始終1是 的第一個(gè)元素Stream),并且您繼續(xù)將該值添加到List.


讓我們用實(shí)際數(shù)字來驗(yàn)證一下:


result被初始化為 Stream 的第一個(gè)元素1。


然后,第一個(gè)片段調(diào)用accumulator.apply(1,2),添加1到List并返回2(這成為新的中間結(jié)果)。下一次迭代將添加2到List并返回3。等等...


第二個(gè)代碼片段調(diào)用accumulator.apply(1,2),添加1到List并返回 1(這仍然是新的中間結(jié)果)。下一次迭代將再次添加1并List再次返回1。等等...


總而言之,您的兩個(gè)累積函數(shù)具有不同的功能:


第一個(gè)結(jié)果是的最后一個(gè)元素Stream(因?yàn)樗粩鄟G棄當(dāng)前結(jié)果并將其替換為當(dāng)前元素)。


第二個(gè)結(jié)果是的第一個(gè)元素Stream(因?yàn)樗A舻谝粋€(gè)元素并忽略所有其他元素)。


查看完整回答
反對(duì) 回復(fù) 2023-05-10
?
動(dòng)漫人物

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊

這不是您問題的直接答案,但由于我說有狀態(tài)過濾器會(huì)更好,所以我覺得有必要展示它。采用以下有狀態(tài)謂詞:


public class GreaterThanPreceding implements Predicate<Integer> {

    private Integer preceding = null;


    @Override

    public boolean test(Integer current) {

        boolean greaterThan = preceding == null || (current > preceding);

        preceding = current;

        return greaterThan;

    }

}

這樣,流操作將如下所示:


List<Integer> collected = list.stream()

        .filter(new GreaterThanPreceding())

        .collect(Collectors.toList());

System.out.println(collected);


查看完整回答
反對(duì) 回復(fù) 2023-05-10
  • 2 回答
  • 0 關(guān)注
  • 131 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)