Java 8 Streams - Frage zu "reduce"

Hallo,

ich habe folgende Methode gegeben:
Java:
private static Person reduceMethod(BinaryOperator<Mensch> op)
    {
        //Implementieren
        return null;
    }

und soll nun aus einer List welche Objekte gespeichert hat, welche u.a. die Attribute Alter:Int und Name:String haben, über die o.g. Funktion unterschiedlich auf jeweils ein Objekt der Liste reduzieren; oder anders: Ich soll die Methode zweimal mit unterschiedlichen Parametern aufrufen.
Es soll funktional(!) programmiert werden.

Einmal auf das Objekt mit dem längsten Namen getName().length() und einmal auf das Objekt mit dem höchsten Alter getAlter().

Der Methodenkopf darf nicht verändert werden.

Ich verstehe das mit dem binary Operator nicht, ich kann doch da nur eine Sache übergeben, wie schreibe ich das in der Funktion, dass er einmal die String Längen sich anschaut und einmal ein komplett anderes Attribut nimmt, noch dazu von einem anderen Typ und dann dort das größte Objekt ausgibt?

Der obige Code ist Teil einer längeren Aufgabe, von der ich alles lösen konnte, nur hierzu hab ich absolut keine Idee.

Hoffe jemand kann mir helfen!

Grüße
 
Zuletzt bearbeitet:
Es soll funktional(!) programmiert werden.

In einer Objekt Orientierten Sprache, in der du gerade schon mit Objekten arbeitetst halte ich es für recht unmöglich rein funktional zu bleiben. Allerdings mag das auch nur eine unglückliche Formulierung für "Erstellen sie keine neuen Objekte" sein.

Das Problem hier ist das Folgende: der BinaryOperator ist eigentlich dafür zuständig irgendwelche Vergleiche zu machen, wenn du z.B. erst den, mit dem größeren Alter nehmen willst dann muss das in den Operator. In dieser Methode musst du eigentlich nur die apply Methode aufrufen.
 
Ich verstehe deine Antwort nicht so wirklich. Was meinst du mit neuen Objekten erzeugen? Außerdem soll ich das größte Objekt finden bzw. das, wo das bestimmte Attribut am größten ist.

Es darf nur der Methodenkopf nicht verändert werden.

Hast du ein Beispiel für die Apply Funktion die das umsetzt was ich benötige?

Eine funktionale Filterfunktion von mir sieht z.B. so aus:
Java:
public static Comparator<Mensch> byName = Comparator.comparing(Mensch::getName);
public static Comparator<Mensch> byAge = Comparator.comparing(Mensch::getAlter);

private static List<Mensch> filterMethod(Predicate<Mensch> predicate)
    {
    	return liste.stream().filter(predicate).collect(Collectors.toList());
    }
 
Zuletzt bearbeitet:
Dann lass uns doch mal etwas klarstellen:
- Person erbt von Mensch, richtig?
- Ich nehme an, du hast da irgendwo eine statische List/Set/Map mit Menschen/Personen?
 
Ich habe Menschen, ohne Vererbung. Also die Objecte sind vom Typ "Mensch".
Genau, eine statische Liste welche etwa 10 dieser Objekte enthält.

Ich soll jetzt einmal das Objekt zurückgeben, mit dem höchsten Alter und dann ein anderes mal das Objekt aus der Liste mit dem längsten Namen. Beides soll über die gleiche Funktion abgewickelt werden, nur der Übergabewert (der des BinaryOperators) ändert sich.
 
Zuletzt bearbeitet:
Java:
    private static Person reduceMethod(BinaryOperator<Mensch> op)
        {
            Mensch selectedHuman = <deine_list>.stream().reduce(op).get();
            return <wandle selectedHuman in Person um>;
        }

Dann musst du nur noch den BinaryOperator deiner Wahl implementieren. Hier zum Beispiel einer, der für Person den ältesten Zurückgibt:

Java:
BinaryOperator<Person> oldestPersonOperator = (p1,p2) -> (p1.getAlter() >= p2.getAlter())?p1:p2;
 

Zurück
Oben