FunctionalInterface is an interface with :
- only one abstract method.
- zero or several default methods (with body).
Thus, the compiler will be able to find the method corresponding to the lambda you will pass.
Eg;
@FunctionalInterface
public interface Supplier<T> {
T get();
default String greet() {
return "Hello, World ";
}
default String greet2() {
return "Hello, World 2";
}
}
Thus java will easily find the right (abstract) method because is is unique.
Supplier<Car> fordCarProvider = () -> new Car("Ford", 1500, 4, 43000);
Supplier<Car> bmwCarProvider = () -> new Car("BMW", 1500, 4, 83000);
System.out.println(fordCarProvider.get());
System.out.println(bmwCarProvider.get());
But in case you have several abstract method, it is no more a FunctionalInterface. Because ambiguity might occur.
// No more @FunctionalInterface
public interface Supplier<T> {
T get();
String greet();
default String greet2() {
return "Hello, World 2";
}
}
Answer from g.momo on Stack OverflowWhat's the difference between using function types and functional interfaces as listeners/callbacks?
Guide to Functional Interfaces in Java
(ELI5) What exactly is the use of "functional Interface"?
What is the purpose of an Interface?
FunctionalInterface is an interface with :
- only one abstract method.
- zero or several default methods (with body).
Thus, the compiler will be able to find the method corresponding to the lambda you will pass.
Eg;
@FunctionalInterface
public interface Supplier<T> {
T get();
default String greet() {
return "Hello, World ";
}
default String greet2() {
return "Hello, World 2";
}
}
Thus java will easily find the right (abstract) method because is is unique.
Supplier<Car> fordCarProvider = () -> new Car("Ford", 1500, 4, 43000);
Supplier<Car> bmwCarProvider = () -> new Car("BMW", 1500, 4, 83000);
System.out.println(fordCarProvider.get());
System.out.println(bmwCarProvider.get());
But in case you have several abstract method, it is no more a FunctionalInterface. Because ambiguity might occur.
// No more @FunctionalInterface
public interface Supplier<T> {
T get();
String greet();
default String greet2() {
return "Hello, World 2";
}
}
@FunctionalInteface in Java is the interface with only one method.
https://www.baeldung.com/java-8-functional-interfaces
Is there any difference between setting up a listener/callback with a function type like so:
class Observed {
private lateinit var listener: () -> Unit
fun setListener(listener: () -> Unit) {
this.listener = listener
}
fun doSomething() {
println("I did something")
listener()
}
}
fun main() {
val observed = Observed()
observed.setListener {
println("I observed doSomething() inside the Observed class and got called back")
}
observed.doSomething()
}and setting up a listener/callback with a functional interface like so:
class Observed {
private lateinit var listener: Listener
fun setListener(listener: Listener) {
this.listener = listener
}
fun doSomething() {
println("I did something")
listener.onDoSomething()
}
}
fun interface Listener {
fun onDoSomething()
}
fun main() {
val observed = Observed()
observed.setListener {
println("I observed doSomething() inside the Observed class and got called back")
}
observed.doSomething()
}What are your thoughts and which approach do you prefer most?