A functional interface has exactly one abstract method, also called, SAM interface (Single Abstract Method). SAM interfaces have a special place in Java 8 because they can be implemented using Lambda expressions or Method references.
BatchConsumer:
Batch:
Output:
@FunctionalInterface annotation allows us to forces a compilation error when an additional, non-overriding abstract method is added to a SAM. Once the SAM contract is broken, the interface could no more be used in Lambda implementations.BatchConsumer:
package refactor;
import java.util.function.Consumer;
/**
* A functional interface example
*/
@FunctionalInterface
public interface BatchConsumer<T> extends Consumer<T> {
default void beforeConsume() {}
default void afterConsume(){}
}
BatchConsumer contains single abstract method accept() but can contain default methods.
The default methods have an implementation and are not abstract so it will still remain a functional interface.
If we add one more method to the SAM interface, will result in the below compilation error:
Multiple non-overriding abstract methods found in interface refactor.BatchConsumer.
Batch:
package refactor;
import java.util.Arrays;
public class Batch {
public static void main(String[] args) {
consumeIntegers(i -> System.out.println(Arrays.asList(i)));
consumeIntegers(new BatchConsumer<Integer[]>() {
public void beforeConsume() {
System.out.println("before consuming");
}
@Override
public void accept(Integer[] i) {
System.out.println(Arrays.asList(i));
}
public void afterConsume() {
System.out.println("after consuming");
}
});
}
private static void consumeIntegers(BatchConsumer<Integer[]> consumer) {
consumer.beforeConsume();
consumer.accept(new Integer[]{1, 2, 3, 4});
consumer.afterConsume();
}
}
Output:
[1, 2, 3, 4] before consuming [1, 2, 3, 4] after consuming
