I don't want to have a normal lambda implementing a method and redefine it's toString as a added value. I want the lambda expression implement only the toString method. I know I am not expressing it very well but I am sure you will understand me with this example.
public class LambdaToStringTest {
public interface ToStringInterface {
public abstract String toString();
}
public static void main(String[] args) {
print("TRACE: %s", (ToStringInterface)()->someComputation()); // <<-- ERROR: The target type of this expression must be a functional interface
}
private static void print(String format, Object... args) {
System.out.println(String.format(format, args));
}
}
It compiles if I change the name of the method but then it does not override toString so print method will not print what is expected.
This is an attempt to define a log subsystem that evaluates lambdas only when needed (when it is really going to be printed) but being compatible with non-lambda arguments. I know other ways to achieve it but I wonder why I can't do it this way and if there is a workaround or I am doing something wrong,
Lambda Expressions were added in Java 8. A lambda expression is a short block of code which takes in parameters and returns a value. Lambda expressions are similar to methods, but they do not need a name and they can be implemented right in the body of a method.
Lambda expression is a new and important feature of Java which was included in Java SE 8. It provides a clear and concise way to represent one method interface using an expression. It is very useful in collection library. It helps to iterate, filter and extract data from collection.
Create the Runnable interface reference and write the Lambda expression for the run() method. Create a Thread class object passing the above-created reference of the Runnable interface since the start() method is defined in the Thread class its object needs to be created. Invoke the start() method to run the thread.
The toString method is in the Object class in java.
Short answer, you can't. @FunctionalInterface
s cannot be used to "override" methods from Object
.
You can implement Formattable
however, with a virtual extension method. Note: code below is UNTESTED:
@FunctionalInterface
public interface ToStringInterface
extends Formattable
{
String asString();
@Override
default void formatTo(Formatter formatter, int flags, int width, int precision)
{
formatter.format("%s", this);
// Or maybe even better:
formatter.out().append(this.asString());
}
}
I propose this solution since you are using String.format()
which makes use of this interface.
Or you can just define your own interface. Or even write a wrapper for this interface which calls .toString()
in .asString()
. Choices are many.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With