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

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

通過(guò)多次檢查過(guò)濾與謂詞匹配的第一個(gè)元素

通過(guò)多次檢查過(guò)濾與謂詞匹配的第一個(gè)元素

泛舟湖上清波郎朗 2024-01-05 16:54:49
我正在嘗試使用流過(guò)濾具有兩個(gè)不同謂詞的 POJO 列表。public class Toy {  public boolean isRed();  public boolean isBlue();  public boolean isGreen();}public class RedBlueExtravaganza {  public RedBlueExtravaganza(RedToy rt, BlueToy bt) {    //construct  }}// Wrappers around Toy with more verbose namespublic class RedToy extends Toy { }public class BlueToy extends Toy { }public class GreenToy extends Toy { }基本上,我想要玩具對(duì)象列表中的第一個(gè)紅色和第一個(gè)藍(lán)色玩具。List<Toy> toyList = Arrays.asList(greenToy1, redToy1, greenToy2, redToy2, blueToy1);我想編寫一個(gè)執(zhí)行以下操作的流:RedBlueExtravaganza firstRedBlueList = toyList.stream()       // get first red but keep rest of list       // get first blue but keep rest of list       // discard rest of list       // map to a Tuple (or something) to distinguish the one red and one blue toy       // map to RedBlueExtravaganza       .findFirst()       .get();log.info(firstRedBlueList); // now contains redToy1, blueToy1謝謝您的幫助!
查看完整描述

3 回答

?
呼喚遠(yuǎn)方

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

這是一個(gè)僅遍歷列表一次的解決方案,在最后為您提供第一個(gè)紅色和藍(lán)色玩具。我們可以過(guò)濾掉所有其他不相關(guān)的顏色,然后創(chuàng)建一個(gè)映射,其鍵是玩具是否是紅色,值是符合給定條件的第一個(gè)玩具。它看起來(lái)是這樣的。


Map<Boolean, Toy> firstRedAndBlueToysMap = toyList.stream()

    .filter(t -> t.isBlue() || t.isRed())

    .collect(Collectors.toMap(Toy::isRed, t -> t, (a, b) -> a));

Toy firstRedToy = firstRedAndBlueToysMap.get(true);

Toy firstBlueToy = firstRedAndBlueToysMap.get(false);

這是解決您問(wèn)題的一步法。


RedBlueExtravaganza firstRedAndBlueToyPair = toyList.stream()

    .filter(t -> t.isBlue() || t.isRed())

    .collect(Collectors.collectingAndThen(Collectors.toMap(Toy::isRed, 

           t -> t, (a, b) -> a),

        m -> new RedBlueExtravaganza(m.get(true), m.get(false))));

PS 為此,您需要在RedBlueExtravaganza類中擁有以下構(gòu)造函數(shù),與上面提供的構(gòu)造函數(shù)相反。


public RedBlueExtravaganza(Toy rt, Toy bt) {

    if (!(rt instanceof RedToy) || !(bt instanceof BlueToy))

        throw new IllegalArgumentException();


    // remainder omitted.

}


查看完整回答
反對(duì) 回復(fù) 2024-01-05
?
慕標(biāo)5832272

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

類似的解決方案可以是減少并列出為“元組(或其他)”

List<Toy> reduceToList = toyList.stream()

? ? ? .filter(t -> t.isBlue() || t.isRed())

? ? ? .map(t -> Arrays.asList(t, t))

? ? ? .reduce(Arrays.asList(null, null), (a, c) -> a.get(0) == null && c.get(0).isRed() ?

? ? ? ? ? ? ? Arrays.asList(c.get(0), a.get(1)) : (a.get(1) == null && c.get(1).isBlue() ?

? ? ? ? ? ? ? Arrays.asList(a.get(0), c.get(1)) : a)

? ? ? );

如果兩個(gè)值都不為空,那么您可以映射到RedBlueExtravaganza


查看完整回答
反對(duì) 回復(fù) 2024-01-05
?
隔江千里

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

我首先想到的一種方法是使用 2 個(gè)流分別查找第一個(gè)紅色和藍(lán)色玩具對(duì)象。然后通過(guò)使用將它們合并到一個(gè)流中,Stream.concat()以便您可以為此添加更多操作。


代碼片段


RedBlueExtravaganza firstRedBlueList = Stream

    .concat(

            toyList.stream().filter(t -> t.isRed())

            .findFirst()

            .map(Collections::singletonList)

            .orElseGet(Collections::emptyList)

            .stream(),

            toyList.stream().filter(t -> t.isBlue())

            .findFirst()

            .map(Collections::singletonList)

            .orElseGet(Collections::emptyList)

            .stream())

    .map(x -> {

        RedToy rt = new RedToy();

        BlueToy bt = new BlueToy();

        ...

        return new RedBlueExtravaganza(rt, bt);})

    .findFirst()

    .get();


查看完整回答
反對(duì) 回復(fù) 2024-01-05
  • 3 回答
  • 0 關(guān)注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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