Kann Java 8 Consumer irgendwie parametrisiert werden? Ich möchte einen wiederverwendbaren Verbraucher haben, bei dem ich zusätzliche Argumente an die Stelle setzen kann, an denen ich ihn verwende.Java 8 funktionale Schnittstelle (Consumer) zusätzlicher Parameter
List<DateTime> dates = new ArrayList<DateTime>();
Set<Alarm> alarms = new HashSet<Alarm>();
Consumer<Entry> entryConsumer1 = entry -> {
LocalTime time = entry.getDate().toLocalTime();
Alarm alarm = new Alarm(time, calendar1.getPattern());
alarms.add(alarm);
dates.add(entry.getDate());
};
Consumer<Entry> entryConsumer2 = entry -> {
LocalTime time = entry.getDate().toLocalTime();
Alarm alarm = new Alarm(time, calendar2.getPattern());
alarms.add(alarm);
dates.add(entry.getDate());
};
calendar1.generateEntries(criteria).forEach(entryConsumer1);
calendar2.generateEntries(criteria).forEach(entryConsumer2);
calendar1, Calendar2 sind vom gleichen Typ
Wie Sie sowohl Verbraucher nur in einem Argument unterscheiden sehen. Ist es möglich, diesen Code zu vereinfachen/nicht zu duplizieren?
Während' collect' besser ist, hat Java keine gute Möglichkeit, zwei Ergebnisse zu erzeugen, dh "Alarme" und "Daten" aus einem Stream. –
@Jesper Während "funktionale Programmierungsprinzipien" von der Abhängigkeit von Nebenwirkungen abraten, beachten Sie bitte, dass die funktionale Schnittstelle 'Consumer' _ ausschließlich für den Zweck der Modellierung von seiteneffektiven Berechnungen existiert. Es gibt nichts zurück - wenn es also eine reine Funktion darstellt, wäre die Abstraktion nutzlos. (Es ist der Fall, dass Stream-Methoden wie 'forEach()' oft verwendet werden, wenn 'collect()' oder 'reduce()' den Job besser machen könnten - aber vorausgesetzt, die Wahl, 'Consumer' zu verwenden, war Sound keinen Sinn, dann die Nebenwirkungen zu kritisieren, die der Implementierung von 'Consumer' innewohnen.) –
@BrianGoetz danke für den Kommentar, ich verstehe, ich wollte das erwähnen, weil ich oft Leute ohne funktionale Programmiererfahrung' forEach' mit Nebeneffekt sehe Lambda für alles, anstatt "den funktionalen Weg" zu denken. – Jesper