2016-10-14 4 views
0

Gibt es eine elegante Möglichkeit, den Rückgabewert der Methode apply() zu speichern, sodass sie nicht mehr als einmal aufgerufen werden muss? Weil ich nur daran denken kann, eine lokale Map-Variable zu erstellen, die die Funktion "Rückgabewert" -Paare speichert.Java-8-Funktion beim Iterieren einer Funktionsliste nur einmal aufrufen

@Autowired 
private List<Function<String, String>> evaluators; 
//... 
private String evaluate(String code) { 
    return evaluators.stream().filter(f -> f.apply(code) != null).findFirst().get().apply(code); 
} 
+2

Aber wenn Sie die Methode mit anderen 'Code' aufrufen, würden Sie anderes Ergebnis erwarten, nicht wahr? Sie möchten also, dass ein Cache des Codes zur Anwendung der Funktion führt? – Tunaki

+0

Ja, ich hatte auf einen Caching-Mechanismus gehofft, der bereits in Java 8 eingebaut ist. –

+2

Nichts eingebaut. Das Konzept nennt sich "Memoization", also versuchen Sie es zu googeln. Der allgemeine Ansatz wäre eine Methode, die Ihre Lambda-Instanz mit einer Memo-Ebene umschließt. –

Antwort

7

Versuchen Sie dies.

private String evaluate(String code) { 
     return evaluators.stream() 
      .map(f -> f.apply(code)) 
      .filter(s -> s != null) 
      .findFirst().get(); 
    } 
+0

Sieht interessant aus! Werde es überprüfen, danke! –

+1

Warte, war das die Frage? Ich dachte OP wollte [zu cachen] (http://stackoverflow.com/questions/40038340/calling-a-java-8-function-only-once-when-iterating-a-function-list#comment67352825_40038340) das Ergebnis von eine Funktion auf einen bestimmten Code anwenden? Dadurch werden die Funktionen weiterhin aufgerufen, wenn Sie mit demselben Code "evaluate" aufrufen. – Tunaki

+4

@Tunaki: Diese Antwort identifiziert das XY-Problem der Frage. Der ursprüngliche Stream-Code ruft die gleiche Funktion unnötigerweise zweimal auf. Durch das Beheben dieses Problems müssen keine Ergebnisse mehr zwischengespeichert werden. – Holger

Verwandte Themen