Beim Versuch, von einem Lambda zu einem Methodenverweis zu reformieren, habe ich festgestellt, dass es Unterschiede in den Methodenreferenzen gibt, die die lokalen Variablen des Aufrufers nicht erhalten (der lexikalische Umfang?). Wenn ein Lambda als Inline-Code verwendet wird, gibt es überhaupt kein Problem.Java Lambda vs Methodenreferenz - Die lokalen Variablen des Aufrufers werden nicht empfangen
public class MethodRef {
public static void main(String[] args) {
String appender = "I am appended";
//possible
appender("Hello! ", former -> {
StringBuilder builder = new StringBuilder(former);
builder.append(appender);
System.out.println(builder.toString());
});
//not possible
appender("Hello! ", this::theRef);
}
//Delegater
public static void appender(String former, Consumer<String> consumer){
consumer.accept(former);
}
//Method Ref
public void theRef(String former){
StringBuilder builder = new StringBuilder(former);
builder.append(appender);
System.out.println(builder.toString());
}
}
Ich verstehe, dass die param Liste der Methode keine „appender“ hat ergeben, aber nicht, dass es eine „versteckte“ param ich verwenden kann, um die lexikalische Vars des Anrufers/Verbraucher Umfang zugreifen?
Sie versuchen, auf eine Member-Methode aus einem statischen Kontext zuzugreifen. Versuchen Sie, 'theRef'-Methodensignatur in' public static void theRef (String former) 'zu ändern und dann' MethodRef :: theRef' anstelle von 'this :: theRef' zu verwenden. Siehe [Verweis auf eine statische Methode] (https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html) in der Oracle-Dokumentation. – Jezor