Wie Sie hoffentlich wissen, können Sie in Java 8 lambdas verwenden, um beispielsweise anonyme Methoden zu ersetzen.Wie TimerTask mit Lambdas zu verwenden?
Ein Beispiel kann 8 hier von Java 7 vs Java zu sehen:
Runnable runnable =() -> checkDirectory();
oder
Runnable runnable = this::checkDirectory;
:
Runnable runnable = new Runnable() {
@Override
public void run() {
checkDirectory();
}
};
können, da beide die folgenden Möglichkeiten in Java 8 ausgedrückt werden
Dies ist, weil Runnable
eine funktionale Schnittstelle ist, mit nur einem (abstrakten) öffentlichen Nicht-Standard-me thod.
jedoch ... Für TimerTask
haben wir folgendes:
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
checkDirectory();
}
};
kommt mir bekannt vor, nicht wahr?
Die Verwendung eines Lambda-Ausdrucks funktioniert jedoch nicht, da TimerTask
eine abstrakte Klasse ist, obwohl es nur eine abstrakte nicht standardmäßige öffentliche Methode gibt, keine Schnittstelle und daher auch keine funktionale Schnittstelle.
Es ist auch nicht in eine Schnittstelle mit Standardimplementierungen umgestaltet, weil es Zustand trägt, so dass es dann nicht getan werden kann.
Also meine Frage: Gibt es eine Möglichkeit, Lambdas beim Aufbau der TimerTask
zu verwenden?
Was ich wollte, ist folgendes:
Timer timer = new Timer();
timer.schedule(this::checkDirectory, 0, 1 * 1000);
Statt einige hässliche anonyme innere Klasse, ist es eine Möglichkeit, es schöner zu machen?
Da Sie moderne Funktionen zu verwenden, warum nicht den ganzen Weg und verwende einen 'ScheduledExecutorService' anstelle einer' TimerTask'? ;) – fge
@fge Nun, ich wusste nicht, dass es existiert, bis jetzt ... Jetzt denke ich darüber nach, hat Java ihre APIs nicht erwähnen, dass es eine neuere ähnliche Funktion gibt, wenn das alte Feature noch nicht * ist veraltet *? – skiwi
Im Fall von 'Timer' rät Josh Bloch's Effektive Java 2nd Edition. Es ist jedoch keine offizielle Position der JDK-API. –