Le choix d'utiliser min
au lieu de max
ne diffère pas d'utiliser encore l'opération max
, mais avec un ordre inverse, vous pouvez donc utiliser
Initialisation:
Comparator<RowDataSet> c = Comparator.comparingLong(RowDataSet::getId);
if(expComponents[0] != 'M') c = c.reversed();
Le fonctionnement réel
RowDataSet rdsHavingMaxNumericValue =
dataList.stream()
.filter(r -> r.getLong(NUMERIC_VALUE) != null)
.max(c)
.get();
Rever chanter la commande n'a aucun impact sur les performances. Cela implique simplement appeler r2.getId().compareTo(r1.getId())
au lieu de r1.getId().compareTo(r2.getId())
...
Une alternative serait
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();
Cette anticipe what min
and max
would do ...
Vous pouvez utiliser les deux variantes pour créer votre BiFunction
, par exemple
Variante 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();
Variante 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();
Bien sûr, vous pouvez aussi vivre avec une duplication de code
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();
Dans les deux cas, la condition expComponents[0] == 'M'
est vérifié une seule fois lorsque le BiFunction
est créé et jamais évalué lorsque mrOrlrOperation.apply(…)
est invoqué.
Ouais, ressemble à l'option, mais je veux éviter la recherche de cas lors de l'exécution – Ajeetkumar
Que voulez-vous dire? – assylias
Je ne veux pas effectuer d'opérations if else. Je l'ai laissé comme une dernière option – Ajeetkumar