Java 8 Mehrfach-Mapping

8

Ist es möglich, mehrere Mappings bei der Sammlung durchzuführen? Folgender Code-Kompilierungsfehler:

  

... in Stream kann nicht auf java.util.function.Function<capture<?>,capture<?>>

angewendet werden
%Vor%

Ich möchte eine generische Lösung.

    
Artur 18.03.2016, 23:00
quelle

2 Antworten

3

Wenn Sie wenige Funktionen haben (d. h., wenn Sie sie aufschreiben können), schlage ich vor, dass Sie sie nicht zu einer Liste hinzufügen. Erstellen Sie sie stattdessen in einer einzigen Funktion und wenden Sie dann diese einzelne Funktion auf jedes Element der angegebenen Auflistung an.

Ihre multipleMapping() -Methode würde nun eine einzige Funktion erhalten:

%Vor%

Dann könnten Sie im aufrufenden Code eine Funktion erstellen, die aus vielen Funktionen besteht (Sie werden sowieso alle Funktionen haben) und die Methode multipleMapping() mit dieser Funktion aufrufen.

Angenommen, wir haben eine Liste von Kandidaten:

%Vor%

Und vier Funktionen:

%Vor%

Mit diesen Funktionen können Sie eine neue Funktion wie folgt erstellen:

%Vor%

Oder auch so:

%Vor%

Nun können Sie Ihre Methode multipleMapping() mit der Liste der Kandidaten und der zusammengesetzten function aufrufen:

%Vor%

Wir haben also unsere Kandidatenliste in eine Liste von Scores umgewandelt, indem wir explizit eine neue Funktion aus vier verschiedenen Funktionen zusammensetzen und diese kompilierte Funktion auf jeden Kandidaten anwenden.

Wenn Sie wissen wollen, wer die Wahl gewinnen wird, können Sie überprüfen, welcher Kandidat die höchste Punktzahl hat, aber ich werde das als Übung für jeden, der sich für Politik interessiert, lassen;)

    
Federico Peralta Schaffner 19.03.2016, 01:25
quelle
8

Das Problem rührt von der Tatsache her, dass Sie einen generischen Platzhalter ? verwenden. Was Sie wollen, ist ein parametrisierter Typ T , der den Typ des Stream-Elements darstellt. Angenommen, die Funktion würde den gleichen Typ wie ihre Eingabe zurückgeben, könnten Sie Folgendes haben:

%Vor%

Dies wird gut übersetzt: Der Mapper, der an map übergeben wurde, akzeptiert eine T und gibt eine T zurück. Wenn die Funktionen jedoch nicht den gleichen Typ wie ihre Eingabe zurückgeben, können Sie die Typsicherheit nicht beibehalten und müssen dazu List<Function<Object, Object>> verwenden.

Beachten Sie, dass wir eine UnaryOperator<T> verwenden könnten anstelle von Function<T, T> .

Sie können auch die for -Schleife vermeiden und alle Funktionen in eine einzige reduzieren, indem Sie andThen verwenden:

%Vor%     
Tunaki 18.03.2016 23:03
quelle