As you hopefully know you can use lambdas in Java 8, for example to replace anonymous methods.
An example can be seen here of Java 7 vs Java 8:
Runnable runnable = new Runnable() {
@Override
public void run() {
checkDirectory();
}
};
Can be expressed as both the following ways in Java 8:
Runnable runnable = () -> checkDirectory();
or
Runnable runnable = this::checkDirectory;
This is because Runnable
is a functional interface, having only one (abstract) public non-default method.
However... For TimerTask
we have the following:
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
checkDirectory();
}
};
Looks familiar, right?
Using a lambda expression does not work though, because TimerTask
is an abstract class, even though it has only one abstract public non-default method, it is not an interface and hence no functional interface either.
It is also not refactored into an interface with default implementations, because it carries state, so that cannot be done then.
So my question: Is there any way to use lambdas when constructing the TimerTask
?
What I wanted is the following:
Timer timer = new Timer();
timer.schedule(this::checkDirectory, 0, 1 * 1000);
Instead of some ugly anonymous inner class, is there any way to make it nicer?