Functional Interface

It’s an interface with just only one abstract method. it can have any number of default or static methods . lambdas can only operate on functional interface. it is also referred as Single Abstract Method Interfaces, or SAM Interfaces

interface Foo1{
    void bar();
}

interface Foo2 {
    int bar(boolean isFoo);
}

interface Foo3{
    String bar (Object obj , int i1);
}
interface Foo4 {
    default String bar(){
        return "baz" ;  //it's default so not counted
    }
    void mee();

}

when you declare functional interface @FunctionalInterface can be added , but if you applied on that interface which is not functional compiler error will be generated

@FunctionalInterface
interface Foo5{
    void bar(); 
}

@FunctionalInterface
interface BlankFoo1 extends Foo3{
    //it  inherits abstract method from Foo3

}

@FunctionalInterface
interface Foo6{
    void bar();
    @Override
    boolean equals(Object obj); // override one of objects method so not counted 

}
// this is not functional interface 
interface BadFoo {
    void bar();
    void quux(); // <-- Second method prevents lambda: 
   }

// this is not functional interface , doesn't have any methods 
interface BlankInterface { }