Maximal Strom mit benutzerdefinierten Komparator

Unten ist mein code, der speziell für die Verwendung benutzerdefinierter Comparator mit max in 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 +
                    '}';
        }
    }
}

Ich bin immer ein syntax-Fehler, die auf eine Methode verweisen, die ich nicht verstehe.

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

während IntelliJ IDEA beschwert, dass Non-static method cannot be referenced from a static context.

Was genau mache ich hier falsch?


ZUSÄTZLICHE ERKLÄRUNG (04/24/14):

  1. Verstehe ich jetzt den Grund für den Syntaxfehler. Danke.
  2. Wurde speziell Comparator eigentlich hier nötig?

Seit BigDecimal implementiert Comparable aber nicht nicht scheinen zu implementieren Comparator ( es hat CompareTo() aber keine Compare()) ich dachte, die benutzerdefinierte Comparator notwendig war. Deshalb konnte ich nicht einfach Comparator.comparing(ft -> ft.value). Ist es ein Fehler in meiner Logik?

Eine benutzerdefinierte Komparator ist nicht hier erforderlich. Erstens ist dies eine unübersichtliche API-da sind die Namen alle so ähnlich sind. Anfahren, Sie sind richtig, dass BigDecimal implementiert Vergleichbar, aber Stream.max() will einen Komparator. Die one-arg überlastung der Komparator.Vergleich() tut dies. Auch die ForTest-Klasse (original version) gar nicht implementieren. Sie müssen also die Lieferung eines lambda - ft -> ft.value zu extrahieren BigDecimal (das ist Vergleichbar) aus der ForTest, und dann passieren diese lambda-arg-Komparator.Vergleich() zum erstellen eines Komparators angesichts der Vergleichbaren Instanzen.
Ich Las eigentlich comparing Beschreibung mehrmals, aber nur nach der Lektüre Ihre Antwort (auch mehrmals), habe ich realisiert, was es bedeutete. Also comparaing dient als Brücke zwischen Comparator und Comparable, richtig?
Ja, das ist ein guter Weg, es zu beschreiben. Leider sind die Dokumentation und die Generika in der Signatur sind Recht kompliziert, so dass es sehr schwer ist, zu lernen, die Nutzung nur durch das Lesen der Dokumentation. Dann sehen Sie ein Beispiel und gehen Sie "aha!" Ich hoffe.

InformationsquelleAutor PM 77-1 | 2014-04-24

Schreibe einen Kommentar