Ich habe neulich einen Artikel wie diesen geschrieben.
Ich möchte die überverschachtelten () loswerden https://qiita.com/tkturbo/items/04960f4e3e7226de3b46
Ich habe hier geschrieben
// using custom object
const applier = (val)=>{
const o={
value : val,
apply : (unary)=>{ o.value=unary(o.value); return o; }
};
return o;
};
console.log(applier(name).apply(f0).apply(f1).apply(f2).value);
Lassen Sie uns dies heute in Java konvertieren.
Applier.java
public class Applier<T> {
private T value;
public Applier(T value) {
this.value = value;
}
// import java.util.function.Function;
public <R> Applier<R> apply(Function<? super T, ? extends R> appliable){
return new Applier<R>(appliable.apply(this.value));
}
public T get() { return this.value; }
}
Dies gilt, wenn Sie die Schnittstelle java.util.function.Function verwenden.
Es ist diese eine Zeile, die der Schlüssel sein wird.
public <R> Applier<R> apply(Function<? super T, ? extends R> appliable){
Aus diesem Grund ist es möglich, auch dann zu verarbeiten, wenn die Ein- und Ausgabe unterschiedliche Typen haben.
Zum Beispiel
System.out.println(
new Applier<String>("0001")
.apply(v->Integer.parseInt(v,10))
.apply(v->v+1)
.apply(v->String.format("%04d", v))
.get()
);
Es kann so verwendet werden.
persönlich,
return new Applier<R>(appliable.apply(this.value));
Diese eine Zeile fühlt sich seltsam an, deshalb möchte ich sie so schreiben.
public class Applier<T> {
private T value;
public Applier(T value) {
this.value = value;
}
public <R> Applier<R> apply(Appliable<? super T, ? extends R> appliable){
return new Applier<R>(appliable.applyTo(this.value));
}
public T get() { return this.value; }
@FunctionalInterface
public static interface Appliable<T, R> {
public R applyTo(T value);
}
}
Die öffentliche statische Schnittstelle wird verwendet, um eine Verschmutzung des Namespace zu verhindern.
Recommended Posts