Eine funktionale Schnittstelle ist eine Schnittstelle, in der nur eine abstrakte Methode deklariert ist. Ansonsten gibt es keine besonderen Einschränkungen. Zum Beispiel spielt es keine Rolle, ob Sie mehrere Standardmethoden und private Methoden haben.
Eine Funktion, die eine Schnittstellenimplementierung auf dem Client (Aufrufer) ermöglicht. Bei Verwendung von Lambda-Ausdrücken ist es nicht erforderlich, eine konkrete Klasse zu erstellen, die die Schnittstelle implementiert. Lambda-Ausdrücke sind nur möglich, wenn Sie eine Implementierung einer funktionalen Schnittstelle angeben. Dies liegt daran, dass der Compiler nicht angeben kann, welcher abstrakten Methode die Implementierung (Definition) zugewiesen werden soll, wenn die Schnittstelle mehrere abstrakte Methoden enthält, denen Sie eine Implementierung zuweisen möchten.
Wenn Sie eine Implementierung mit einem Lambda-Ausdruck, einer lokalen Klasse oder einer anonymen Klasse in einer Methode angeben, eine Funktion, mit der die lokalen Variablen des Clients in dem Block verwendet werden können, der die Implementierung angibt. Variablen, die als Abschlüsse verwendet werden, werden in Lambda-Instanzen (für Java) als Felder kopiert. In einigen Sprachen werden Referenzen übergeben. Die im Abschluss übergebenen Variablen sind endgültig.
InfintieIntSequence.java
public interface InfiniteIntSequence{
default public boolean hasNext(){ return true; }
public int next();
public static InfiniteIntSequence generate(IntSupplier s){
return s::getAsInt; //@1
}
public static InfiniteIntSequence iterate(int seed, IntUnaryOperator f){
return new InfiniteIntSequence(){
int lseed = seed; //@2
@Override public int next(){
int res=lseed;
lseed=f.applyAsInt(lseed);
return res;
}
};
}
public static InfiniteIntSequence random(int from, int until){
Random r = new Random();
int bound = until-from;
if(0<bound) return ()->r.nextInt(bound)+from;
else throw new IllegalArgumentException();
}
public static InfiniteIntSequence range(int from){
return iterate(from, i -> i+1 );
}
default public void forEach(IntConsumer c, int n){
while(n-- > 0 && hasNext() ) c.accept(next());
}
}
Was von @ 1 zurückgegeben wird: return ist eine Instanz einer Klasse, die die InfiniteIntSequence-Schnittstelle erbt und die next () -Methode überschreibt. Da InfiniteIntSequence eine funktionale Schnittstelle ist, ist garantiert, dass es nur eine Zusammenfassung und einen Rasen gibt. Daher kann der Compiler verstehen, dass next () überschrieben wird, sodass das Schreiben verschiedener Dinge weggelassen werden kann. next () ist eine Signaturmethode, die einen int-Typ ohne Argumente zurückgibt.
Recommended Posts