Lambda Ausdruck mit Wildcard einschränken

ocsme

Top Contributor
Hallo zusammen,

ich hänge gerade an den Lambdas in Verbindung mit Comparatoren :-D

Hab mir eine kleine Klasse Pair geschrieben die einfach ein Pärchen speichert.
Java:
public class Pairs<T,U>  {
   
    private T t;
    private U u;
   
    public Pairs() {
        t = null;
        u = null;
    }
   
    public Pairs(T t, U u) {
        this.t=t;
        this.u=u;
    }
   
    public T getT() {
        return t;
    }
   
    public U getU() {
        return u;
    }
   
    public String toString() {
        return "("+t.toString()+" ,"+u.toString()+")";
    }
}

Nun habe ich ein Pärchen erstellt mit String und Integer :) und 2 Comparatoren mit Lambda geschrieben die nach T und nach U sortiert werden (also die Pärchen).

Java:
List<Pairs<String,Integer>> list = new ArrayList<>();
            list.add(new Pairs<String,Integer>("I",1));
            list.add(new Pairs<String,Integer>("V",5));
            list.add(new Pairs<String,Integer>("C",100));
            list.add(new Pairs<String,Integer>("II",2));
            list.add(new Pairs<String,Integer>("IX",9));
           
            Collections.sort(list, (o1,o2) -> o1.getT().compareTo(o2.getT()));
            System.out.println(list);
            Collections.sort(list, (o1,o2) -> o1.getU().compareTo(o2.getU()));
            System.out.println(list);

Doch wenn ich einen eigenen Referenztyp nehme klappt das ganze nicht mehr da ich keine compareTo Methode mehr habe.
Deswegen möchte ich den Lambda - Ausdruck über die Wildcards so zum Beispiel einschränken damit Vorausgesetzt ist das T z. B. das Interface Comparable implementiert und somit die Methode compareTo zur verfügung stellt:
Java:
Comparator<T extends Comparable<? super T>,U>

Wenn ich das ganze als eigene Klasse schreiben würde wäre es kein Problem oder als Anonyme Klasse doch als Lambda verstehe ich nicht wie das gehen soll :(

Hier einfach mal als eine eigene Klasse (inner class):
Java:
//    public static class FirstComparator<T extends Comparable<? super T>,U> implements Comparator<Pairs<T,U>> {
//
//        @Override
//        public int compare(Pairs<T,U> o1, Pairs<T,U> o2) {
//            if(o1.getT() == null)
//                return o2.getT() == null ? 0:-1;
//            if(o2.getT() == null)
//                return 1;
//            return o1.getT().compareTo(o2.getT());
//        }
//      
//    }

Vielleicht kann mir da einer weiter Helfen :) vielleicht stoßen Lambdas hier ja auch an Ihre Grenzen was echt schade wäre denn ich dachte ja dafür wären sie da für Anonyme Klassen "Leichter" und "Verständlicher" zu schreiben :D

LG
 

httpdigest

Top Contributor
Du musst nicht den Typ der beiden Typparameter in der Lambda-Funktion einschränken, sondern in deinem generischen Typ `Pairs`:
Java:
public class Pairs<T extends Comparable<T>, U extends Comparable<U>>  { ... }
Denn woher soll denn die Lambda-Funktion wissen, dass es sich bei den Werten in der Pairs Instanz wirklich um Comparables handelt - bzw. wenn es sich nicht um Comparables handelt, dann kann die Lambda-Funktion ja auch nichts mehr machen als zu sagen: Ne, geht nicht. Typen sind nicht Comparable. Bei String und Integer war das gegeben, weil diese Comparable implementieren. Aber, wenn du willst, dass alle möglichen Typargumente von Pairs auch Comparable sind, dann musst du das dort angeben.
 

httpdigest

Top Contributor
By the way: Der Vergleich nach getT() oder getU() lässt sich mit Hilfe von Comparator.comparing() und Method References noch etwas kompakter schreiben:
Java:
import static java.util.Collections.sort;
import static java.util.Comparator.comparing;
...
// Statt: sort(list, (o1,o2) -> o1.getT().compareTo(o2.getT()));
sort(list, comparing(Pairs::getT));
// Statt: sort(list, (o1,o2) -> o1.getU().compareTo(o2.getU()));
sort(list, comparing(Pairs::getU));

EDIT: Auch würde ich die Klasse `Pairs` in `Pair` umbenennen, denn eine Instanz dieser Klasse repräsentiert ja nicht mehrere Paare sondern genau ein Paar.
 

ocsme

Top Contributor
Danke.

Das comparing etc muss ich mir später irgendwann mal anschauen wenn ich so durchblicke :D
Also eigentlich wollte ich bei Pair das nicht einschränken.
Doch anders geht es nicht!

Der Lambda Ausdruck Funkioniert also immer sobald T implements Comparable oder? Dann könnte man bevor man die Methode aufruft doch abfragen ob T eine instanceOf von Comparable ist? Oder geht das nun auch wieder nicht? Andernfalls läuft man eben in eine Exception :D

Danke für das schnelle FeedBack :)
LG
 

mihe7

Top Contributor
Also eigentlich wollte ich bei Pair das nicht einschränken.
Doch anders geht es nicht!
Mach Dir die Sache mit dem Lambdas nicht so schwer: immer, wenn die Implementierung eines funktionalen Interfaces erwartet wird, kannst Du stattdessen einen Lambda-Ausdruck verwenden. Ausschlaggebend für die Typen ist die Spezifikation der Methode im funktionalen Interface - das ist genauso wie bei der Implementierung mit einer anonymen Klasse.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Interface Java Lambda Ausdruck. Java Basics - Anfänger-Themen 11
M Lambda - Ausdruck zu Beschreibung erstellen Java Basics - Anfänger-Themen 7
G Lambda Ausdruck: Welche Methode ist die Richtige? Java Basics - Anfänger-Themen 1
C Interface Parameter und Rückgabewerte in Lambda Ausdrücken verwenden Java Basics - Anfänger-Themen 16
FunkyPhil94 Wert in einer Lambda Funktion erhöhen Java Basics - Anfänger-Themen 3
X Collections.sort als Lambda Java Basics - Anfänger-Themen 14
sserio Frage zu Lambda Ausdrücken Java Basics - Anfänger-Themen 7
I Lambda map -> Children bekommen Java Basics - Anfänger-Themen 1
L Java reduce() + Lambda Java Basics - Anfänger-Themen 10
O Collections.sort und List.sort mit Lambda Verwirrung Java Basics - Anfänger-Themen 5
G Java Lambda Ausdrücke Java Basics - Anfänger-Themen 19
M Java 8 Lambda Expression Java Basics - Anfänger-Themen 1
A Lambda Java Basics - Anfänger-Themen 9
A Lambda-Ausdrücke Java Basics - Anfänger-Themen 6
B Summe von Property innerhalb einer Liste via Lambda Java Basics - Anfänger-Themen 1
G Lambda Ausdrücke Java Basics - Anfänger-Themen 2
O Lambda Ausdrücke in einem Comparator Java Basics - Anfänger-Themen 4
S Lambda Ausdrücke Streams Java Basics - Anfänger-Themen 6
I Null-Überprüfung durch Lambda-Expressions abkürzen Java Basics - Anfänger-Themen 8
M Lambda - Ausdrücke verstehen Java Basics - Anfänger-Themen 2
K Lambda-Expression Java Basics - Anfänger-Themen 4
T Lambda-Funktion bei Binärbäumen Java Basics - Anfänger-Themen 13
K Lambda - kompliziertes filtern Java Basics - Anfänger-Themen 5
N Lambda Ausdrücke richtig schreiben Java Basics - Anfänger-Themen 4
F Methoden Lambda Ausdrücke Methodensignatur Java Basics - Anfänger-Themen 6
E Hilfe bei Lambda-Ausdrücken in BlueJ Java Basics - Anfänger-Themen 1
C Lambda Ausdrücke Java Basics - Anfänger-Themen 1
TheSorm Java 8 Lambda-Ausdrücke Java Basics - Anfänger-Themen 9
M Lambda Expressions Java Basics - Anfänger-Themen 3
W Reguläre Ausdruck Java Basics - Anfänger-Themen 6
hebein PDF Ausdruck auf Drucker - Probleme mit Format Java Basics - Anfänger-Themen 17
K Warum zeigt dieser reguläre Ausdruck true an? Java Basics - Anfänger-Themen 1
berserkerdq2 Wie würde man einen regulären Ausdruck in Java schreiben, der prüft, dass zwei bestimtme Zahlen nicht nebeneinadner sind? Java Basics - Anfänger-Themen 3
P Einfacher regulärer Ausdruck (RegEx) für E-Mail-Adressen Java Basics - Anfänger-Themen 2
KogoroMori21 Boolscher Ausdruck Java Basics - Anfänger-Themen 15
C Ausdruck Java Basics - Anfänger-Themen 4
E Boolescher Ausdruck Java Basics - Anfänger-Themen 1
M Regex-Ausdruck: Alle Zeichen bis auf ein bestimmtes erlauben (p{L}) Java Basics - Anfänger-Themen 5
G Warum ist hier ein Lamda-Ausdruck möglich Java Basics - Anfänger-Themen 2
F Ist das ein korrekter Regex-Ausdruck? Java Basics - Anfänger-Themen 12
B Regulärer Ausdruck Java Basics - Anfänger-Themen 12
G Boolschen Ausdruck true machen Java Basics - Anfänger-Themen 2
F Ausdruck wirft unerwarteten Error Java Basics - Anfänger-Themen 2
D Regulärer Ausdruck Java Basics - Anfänger-Themen 8
K Regulären Ausdruck in Java abbilden Java Basics - Anfänger-Themen 4
B Regulärer Ausdruck Java Basics - Anfänger-Themen 3
D Java Ausdruck erzeugen / Formular Java Basics - Anfänger-Themen 4
B Boolscher Ausdruck für mich unverständlich Java Basics - Anfänger-Themen 7
A regulären Ausdruck mit Hilfe der Klasse Scanner in einem String finden Java Basics - Anfänger-Themen 2
J Frage zu bestimmtem Ausdruck Java Basics - Anfänger-Themen 2
C Auswertung Ausdruck mit Punknotation + Objekt als Parameter Java Basics - Anfänger-Themen 3
M Arithemtischer Ausdruck unklar Java Basics - Anfänger-Themen 2
C Regulärer Ausdruck matched nicht Java Basics - Anfänger-Themen 2
A Lässt sich dieser Ausdruck irgendwie einfacher schreiben? Java Basics - Anfänger-Themen 4
H Regulären Ausdruck automatisch erstellen Java Basics - Anfänger-Themen 5
T Erste Schritte Im arithm. Ausdruck Zeichen trennen? Java Basics - Anfänger-Themen 13
D Boolescher Ausdruck - Problem Java Basics - Anfänger-Themen 6
B Regulärer Ausdruck gesucht Java Basics - Anfänger-Themen 6
M regulärer Ausdruck funktioniert nicht Java Basics - Anfänger-Themen 6
R Suche Regex Ausdruck für HTML Java Basics - Anfänger-Themen 11
E Hilfe bei einem Regulären Ausdruck Java Basics - Anfänger-Themen 7
X Regulärer Ausdruck für einen FileNameFilter Java Basics - Anfänger-Themen 2
S Einfaches Regulaerer Ausdruck Problem Java Basics - Anfänger-Themen 7
S regulärer Ausdruck HTML Java Basics - Anfänger-Themen 5
turmaline Ein regulärer Ausdruck für HTML-Sonderzeichen Java Basics - Anfänger-Themen 3
3 3. Element mit regulären Ausdruck suchen Java Basics - Anfänger-Themen 12
M regex-Ausdruck irgendein Buchstabe 1 mal Java Basics - Anfänger-Themen 8
S Was bedeutet dieser ausdruck? Java Basics - Anfänger-Themen 9
S String nach Ausdruck durchsuchen und Folgeattribut ausgeben Java Basics - Anfänger-Themen 3
H Ausdruck vereinfachen Java Basics - Anfänger-Themen 8
J Datentypen String splitten ohne festen Ausdruck Java Basics - Anfänger-Themen 8
H while schleife ohne ausdruck Java Basics - Anfänger-Themen 7
H Datei durchsuchen mit Regex-Ausdruck Java Basics - Anfänger-Themen 14
O Gibt es dafür einen regulären Ausdruck? Java Basics - Anfänger-Themen 9
B regulärer Ausdruck mit Metazeichen Java Basics - Anfänger-Themen 4
O RegEx-Ausdruck gesucht Java Basics - Anfänger-Themen 2
C bedingten ausdruck zu if-anweisung Java Basics - Anfänger-Themen 3
D regulärer Ausdruck: ^ $ Java Basics - Anfänger-Themen 6
O Mal wieder ein Regex-Ausdruck gesucht! Java Basics - Anfänger-Themen 5
F Regulärer Ausdruck warum false ? Java Basics - Anfänger-Themen 3
O Regulärer Ausdruck gesucht Java Basics - Anfänger-Themen 2
S Regulärer Ausdruck - alles was keine Zahl ist entfernen Java Basics - Anfänger-Themen 2
S regulärer ausdruck zum zählen eines wortes Java Basics - Anfänger-Themen 4
K Regulärer Ausdruck Java Basics - Anfänger-Themen 7
R Regulären Ausdruck geht nicht Java Basics - Anfänger-Themen 2
L Regulärer Ausdruck Java Basics - Anfänger-Themen 2
J Bitte um Erklärung für einen Java-Ausdruck Java Basics - Anfänger-Themen 8
M regulärer Ausdruck Java Basics - Anfänger-Themen 3
T Wie sieht ein '.' im regulären Ausdruck aus? Java Basics - Anfänger-Themen 2
G Wie erstellt man komplexen regulären Ausdruck Java Basics - Anfänger-Themen 5
G Boolscher Ausdruck Java Basics - Anfänger-Themen 11
R Reguläre Ausdruck definieren Java Basics - Anfänger-Themen 3
G Substrings in regulärem Ausdruck Java Basics - Anfänger-Themen 2
F Boolescher Ausdruck (String) in boolean konvertieren Java Basics - Anfänger-Themen 5
F Der "super" Ausdruck Java Basics - Anfänger-Themen 4
S Ausdruck zur Laufzeit auswerten Java Basics - Anfänger-Themen 10
G Was zum Teufel ist denn so ein Ausdruck"variabel : vari Java Basics - Anfänger-Themen 8
X Regulärer Ausdruck Java Basics - Anfänger-Themen 6
E regulärer Ausdruck -> wo ist der Fehler Java Basics - Anfänger-Themen 9
G regulärer Ausdruck alles was zwischen ' ' steht Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben