Wie kommen die Informationen in Lambda rein?


Harry05

Grünschnabel
Künstliches problem

1. wenn ->
Java:
(StringBuilder sb1, StringBuilder sb2) -> sb2.toString().compareTo(sb1.toString())


2. ist ähnlich, gleich ->
Java:
...
public int compare(StringBuilder sb1, StringBuilder sb2) {
        return sb2.toString().compareTo(sb1.toString());
}

und man über gibt der 2. so die Informationen
Java:
...
public static void main(String[] args) {
int s = compare("test", "Test2");
}

wie Kriegt die 1.(Lambda) Ihre Informationen übergeben?


Java:
public static void main(String[] args) {
           String[] words = { "M", "\nSkyfall", " Q", "\t\tAdele\t" };
        
           Comparator<String>c= (String s1, String s2) ->
                s1.trim().compareTo( s2.trim() );
               Arrays.sort( words, c );
              
        }
 
Zuletzt bearbeitet:

zerix

Hausmeister
Moderator
Hallo,

es wird im Normalfall die Funktion compare des Comparators aufgerufen und dort übergeben.

Viele Grüße
Sascha
 

ComFreek

Mod | @comfreek
Moderator
Java:
public static void main(String[] args) {
String[] words = { "M", "\nSkyfall", " Q", "\t\tAdele\t" };

Comparator<String>c= (String s1, String s2) ->
s1.trim().compareTo( s2.trim() );
Arrays.sort( words, c );

}
Die RHS (Right-Hand-Side) der Variablenzuweisung an c ist hier eine Shorthandnotation dafür, dass du eine Instanz erstellst, die das Interface Comparator implementiert, und wobei die compare Methode durch die ebendiese Lambda-Funktion gegeben ist.

Du könntest auch schreiben `Comparator<String> c = new Comparator<> {{ public int compare(...) }}`. Probier's ruhig aus!
 

Harry05

Grünschnabel
@ComFreek wo her hat den jetzt
Java:
s1.trim().compareTo( s2.trim() );
die Daten (Informationen) das es ->
Java:
"M", oder "\nSkyfall", oder " Q", oder "\t\tAdele\t"
ist?

wie kommen die jetzt da rein ? du ruft ja die compare() nirgend wo auf
Java:
compare( "M", "\nSkyfall", " Q", "\t\tAdele\t","M", "\nSkyfall", " Q", "\t\tAdele\t" ){ //code}

Irgenwie Greift sich die Methode aus dem Nix die zukontrollierenden Information ab.
wie kommen die {} in den Block rein.
 

zerix

Hausmeister
Moderator
@Harry05
Das ganze wird in der Methode sort gemacht. sort läuft durch dein/e Array/Liste und ruft dort compare des übergebenen Comparators auf und übergibt dort die Werte

Mal angedeutet:

Code:
class Arrays{

public static void sort(String[] s, Comparator<String>c){

for(int i=0; i<s.length; i++){
     ...
    int x = c.compare(s[i], s[i+1]);
    ...
}

}
}
Das ist nicht der richtige Code, das soll es nur verdeutlichen.

@ComFreek meinte, dass du statt Lambda auch eine anonyme Klasse schreiben könntest:
Code:
Comparator<String> c = new Comparator<> {

public int compare(String s1, String s2) {
       return s1.compareTo(s2);
}

}

compare( "M", "\nSkyfall", " Q", "\t\tAdele\t","M", "\nSkyfall", " Q", "\t\tAdele\t" ){ //code} <- sowas gibt es da nicht.

Viele Grüße
Sascha
 

Harry05

Grünschnabel
@zerix danke ich hab's Endlich WIE es macht zur meiner WAS es macht Sammlung .:D


Java:
class Arrays{

public static void sort(String[] s,[S] Comparator<String>c[/S]){

[S]for(int i=0; i<s.length; i++){
     ...
    int x = c.compare(s[i], s[i+1]);
    ...
}[/S]

C hat den body schon aus / nach ->
public static void sort(String[] s,
c = (StringBuilder sb1, StringBuilder sb2) -> sb2.toString().compareTo(sb1.toString())){

for(int i=0; i<s.length; i++){
     ...
    int x = c(s[i], s[i+1]);
    ...
}


}
}
ANDEUTUNG
zum lambda aber ich hab's Danke sowas habe ich gebraucht.
 

Neue Beiträge