我正在根據以下條件比較兩個串列:
如果list1具有更高的值,
1
則到結果中的第一個元素。如果list2具有更高的值,
1
則到結果中的第二個元素。如果值相同,請跳過它。
我已經在 J??ava 7 中實作了這個解決方案
int min = a.size() > b.size() ? b.size() : a.size();
List<Integer> result = Arrays.asList(0, 0);
for(int i =0; i < min; i ) {
if(a.get(i) > b.get(i))
result.set(0, result.get(0) 1);
else if(a.get(i) < b.get(i))
result.set(1, result.get(1) 1);
}
return result;
我怎么能對 Java 8 流做同樣的事情?
我想出了兩個流并合并兩者的結果。因為我不確定如何在單個流中同時滿足這兩個條件。
uj5u.com熱心網友回復:
使用range()
的方法,IntStream
我們可以創建對這些串列有效的索引流。
要過濾掉值不相等的索引,我們可以應用 filter()
操作。
將結果累積到由兩個元素組成的串列中需要更多的努力。為此,我們可以使用collect(supplier,accumulator,combiner)
:
- 供應商- 回傳一個新的可變容器的函式。在這里,我們需要提供一個應該保存歸約結果的串列;
- accumulator - 是一個函式,定義了如何將流元素添加到容器中的邏輯;
- combiner - 定義如何將兩個容器與并行執行流時獲得的部分結果合并的函式。
List<Integer> a = List.of(1, 2, 5);
List<Integer> b = List.of(1, 2, 8);
List<Integer> result = IntStream.range(0, Math.min(a.size(), b.size()))
.filter(i -> a.get(i) != b.get(i)) // filter out non-equal elements
.collect(
() -> Arrays.asList(0, 0), // supplier - provides a container which contain the results of reduction
(list, i) -> { // combiner - difines the logic on the container should be updated
if (a.get(i) > b.get(i)) list.set(0, list.get(0) 1);
else list.set(1, list.get(1) 1);
},
(left, right) -> { // accumulator - provides the logic for merging the two containers while executing in parallel
left.set(0, left.get(0) right.get(0));
left.set(1, left.get(1) right.get(1));
}
);
System.out.println(result);
輸出:
[0, 1]
如果您懷疑使用流解決此問題的正確方法是什么,請查看 API 檔案,段落Mutable reduction。
而且即使在熟悉了上面的參考之后,你可能會認為沒有collect()
. 例如,我們為什么不簡單地申請filter().forEach()
使代碼更精簡?然后查看 API 檔案的另一部分,它專門用于Side-effects。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/495789.html