選擇使用的min
代替max
是不是不同的仍然使用max
操作,但相反的次序,所以你可以使用
初始化:
Comparator<RowDataSet> c = Comparator.comparingLong(RowDataSet::getId);
if(expComponents[0] != 'M') c = c.reversed();
實際操作
RowDataSet rdsHavingMaxNumericValue =
dataList.stream()
.filter(r -> r.getLong(NUMERIC_VALUE) != null)
.max(c)
.get();
Rever唱歌的順序沒有性能影響。它只是意味着調用r2.getId().compareTo(r1.getId())
代替r1.getId().compareTo(r2.getId())
...
另一種方法是
Comparator<RowDataSet> c = Comparator.comparingLong(RowDataSet::getId);
BinaryOperator<RowDataSet> op = expComponents[0] == 'M'?
BinaryOperator.maxBy(c): BinaryOperator.minBy(c);
RowDataSet rdsHavingMaxNumericValue =
dataList.stream()
.filter(r -> r.getLong(NUMERIC_VALUE) != null)
.reduce(op)
.get();
此預期what min
and max
would do ...
您可以使用變種創建您BiFunction
,例如
變體1:
Function<Comparator<RowDataSet>, Comparator<RowDataSet>>
maxOrMin = expComponents[0] == 'M'? Function.identity(): Comparator::reversed;
BiFunction<List<RowDataSet>, Comparator<RowDataSet>, RowDataSet> mrOrlrOperation
= (dataList, comparator) -> dataList.stream()
.filter(r -> r.getLong(NUMERIC_VALUE) != null)
.max(maxOrMin.apply(comparator))
.get();
變2:
Function<Comparator<RowDataSet>, BinaryOperator<RowDataSet>>
maxOrMin = expComponents[0] == 'M'? BinaryOperator::maxBy: BinaryOperator::minBy;
BiFunction<List<RowDataSet>, Comparator<RowDataSet>, RowDataSet> mrOrlrOperation
= (dataList, comparator) -> dataList.stream()
.filter(r -> r.getLong(NUMERIC_VALUE) != null)
.reduce(maxOrMin.apply(comparator))
.get();
當然,你也可以生活在一個代碼重複
BiFunction<List<RowDataSet>, Comparator<RowDataSet>, RowDataSet> mrOrlrOperation
= expComponents[0] == 'M'?
(dataList, comparator) -> dataList.stream()
.filter(r -> r.getLong(NUMERIC_VALUE) != null)
.max(comparator)
.get():
(dataList, comparator) -> dataList.stream()
.filter(r -> r.getLong(NUMERIC_VALUE) != null)
.min(comparator)
.get();
在這兩種情況下,條件expComponents[0] == 'M'
是BiFunction
創建時只檢查一次,時從未評估被調用。
是啊,看起來像選項,但我想,以避免在運行時 – Ajeetkumar
的情況下查找你是什麼意思? – assylias
我不想執行任何其他操作。我已經把它作爲最後一個選項 – Ajeetkumar