In Java8 gibt es Lambda, Stream, zusätzliche Klassen usw., aber ich bin der Meinung, dass Funktion, Verbraucher, Lieferant, Prädikat usw. die Basis sind, also verstehe ich es richtig.
Function
Ein Mechanismus zum Behandeln des Verhaltens von Methoden in Java mit Instanzen. Die Methodendefinition, die herkömmlicherweise wie folgt durchgeführt wurde,
MethodDefinition
R functionName(T arg) {
return new R();
}
Es kann in der folgenden Form in eine Instanzdefinition geändert werden.
ConventionalDefinition
Function<T, R> functionalInstance = new Function<T, R>() {
@Override
public R apply(T arg) {
return new R();
}
};
Dies ist problematisch, daher können Sie den Lambda-Ausdruck verwenden, um Folgendes zu tun.
InstanceDefinition
Function<T, R> functionalInstance = arg -> new R();
Im Fall der Methodendefinition wurde es wie folgt aufgerufen:
MethodCall
R returnValue = functionName((T) argument);
Wenn Sie Function
verwenden, verwenden Sie die Apply-Methode.
InstanceCall
R returnValue = functionalInstance.apply((T) argument);
Und.
Die Methode in Java ist kein erstklassiges Objekt, aber es scheint, dass wir einen neuen Mechanismus geschaffen haben, um die Einführung eines solchen Stils zu vereinfachen.
Consumer Sobald Sie die Funktion kennen, ist es einfach, und der Consumer ist eine Schnittstelle zum Definieren von Instanzen, die Argumente verbrauchen. Da das Argument verwendet wird, der Rückgabewert jedoch nicht vorhanden ist, gibt es auf der Argumentseite nur eine Typspezifikation durch Generika.
Als Image eine Instanzversion der folgenden Methode.
void consumer(T arg) {
something(arg);
}
Die Definitionsmethode ist wie folgt. Überschreiben Sie die Methode accept, um das Verhalten zu bestimmen.
Consumer<T> consumer = new Consumer<T>() {
@Override
public void accept(T arg) {
something(arg);
}
Für Lambda unten.
Consumer<T> consumer = arg -> something(arg);
Der Anruf wird wie folgt getätigt.
consumer.accept((T) argument)
Supplier Supplier ist eine Schnittstelle zum Definieren von Verhalten, die keine Argumente akzeptiert, aber einen Rückgabewert hat.
Als Image dient es zum Erstellen einer Instanzversion der folgenden Methode.
T consumer() {
return new T();
}
Es ist wie folgt definiert.
Supplier<T> supplier = new Supplier<T>() {
@Override
public T get() {
return new T();
}
}
Unten für Lambda.
Supplier<T> supplier = () -> new T();
Gehen Sie bei der Verwendung wie folgt vor.
supplier.get();
Predicate Prädikat ist eine Schnittstelle, die ein Argument empfängt und einen booleschen Wert zurückgibt.
//Richtig, wenn das Argument 1 ist, andernfalls falsch
Predicate<Integer> predicate = arg -> arg == 1;
Integer argument = 1;
if (predicate.test(argument)) {
System.out.println("argument is 1");
} else {
System.out.println("argument is not 1");
}
Ich benutze es so.
Ich denke, es liegt in der Nähe von Function <T, Boolean>
, aber in diesem Fall gibt es ein Unboxing von Boolean zu Boolean. Ist es also einer der Zwecke, dies zu vermeiden?
Es scheint eine Methode namens und oder oder zu geben, aber ich werde sie weglassen, weil sie selten verwendet zu werden scheint.
Erläuterung des synchronisierten und typischen Fehlerbeispiels Ich habe geschrieben, also schau es dir bitte auch an. Empirisch sind etwa 70% der Menschen falsch.
Recommended Posts