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è)元素并忽略所有其他元素)。

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