3 回答

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.
}

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

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();
添加回答
舉報(bào)