Maximum de Flux, de la coutume de Comparaison

Ci-dessous mon code écrit spécifiquement pour une utilisation personnalisée Comparator avec max dans Java 8 Stream.

import java.math.BigDecimal;
import java.util.*;
public class BigDecimalMax  {
public static BigDecimal getBigDecimalMax(List<forTest> list) {
return list.stream()
.filter(t -> t.id % 2 == 0)
.max(forTestComparator::compare)  //<-- syntax error ----------
.orElse(null);
}
public static class forTestComparator implements Comparator<forTest> {
@Override
public int compare(forTest val1, forTest val2) {
return val1.value.compareTo(val2.value);
}
}
public static void main(String[] args) {
List<forTest> lst = new ArrayList<>();
Random rn = new Random();
BigDecimalMax bdm = new BigDecimalMax();
for (int i=1; i<22; ++i) {
lst.add(bdm.new forTest(i, BigDecimal.valueOf(rn.nextLong())));
}
System.out.println(getBigDecimalMax(lst));
}
class forTest {
public int id;
public BigDecimal value;
forTest(int id, BigDecimal value) {
this.id = id;
this.value = value;
}
@Override
public String toString() {
return "forTest{" +
"id=" + id +
", value=" + value +
'}';
}
}
}

J'obtiens une erreur de syntaxe sur une méthode de référence à laquelle je ne comprends pas.

Error:(15, 18) java: incompatible types: invalid method reference
cannot find symbol
symbol:   method compare(BigDecimalMax.forTest, BigDecimalMax.forTest)
location: class BigDecimalMax.forTestComparator

alors que IntelliJ IDEA se plaint que Non-static method cannot be referenced from a static context.

Exactement ce que je fais mal?


EXPLICATION COMPLÉMENTAIRE (04/24/14):

  1. Je comprends maintenant la raison de l'erreur de syntaxe. Merci.

  2. A été personnalisé Comparator réellement nécessaire ici?

Depuis BigDecimal implémente Comparable mais ne pas semblent mettre en œuvre Comparator ( il a CompareTo() mais pas Compare()), j'ai pensé que la coutume Comparator était nécessaire. C'est pourquoi je ne pouvais pas l'utiliser Comparator.comparing(ft -> ft.value). Est-il une faille dans ma logique?

Une coutume Comparateur n'est pas nécessaire ici. Tout d'abord, c'est une confusion de la zone de l'API puisque les noms sont toutes similaires. À partir, vous avez raison que BigDecimal implémente Comparable, mais de Flux.max() veut un Comparateur. Celui-arg surcharge de Comparateur.comparer (). Aussi, le ForTest classe (original version) n'est pas mise en œuvre. Si vous avez besoin de fournir un lambda ft -> ft.value pour extraire un BigDecimal (ce qui est Comparable) à partir de la ForTest, et la passer lambda à celui-arg Comparateur.comparer() pour créer un Comparateur donné les instances Comparables.
J'ai lu comparing description plusieurs fois, mais seulement après la lecture de votre réponse (plusieurs fois), j'ai réalisé ce que cela signifiait. Donc, comparaing sert comme un pont entre Comparator et Comparable, droit?
Oui c'est une bonne façon de le décrire. Malheureusement, la documentation et les génériques dans la signature est assez compliqué, donc c'est très difficile à apprendre l'utilisation il suffit de lire les docs. Ensuite, vous pouvez voir un exemple et d'aller "aha!" J'ai de l'espoir.

OriginalL'auteur PM 77-1 | 2014-04-24