J'ai écrit un article comme celui-ci l'autre jour.
Je veux me débarrasser du sur-imbriqué () https://qiita.com/tkturbo/items/04960f4e3e7226de3b46
J'ai écrit ici
// 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);
Convertissons cela en java aujourd'hui.
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; }
}
Cela est vrai si vous utilisez l'interface java.util.function.Function.
C'est cette seule ligne qui sera la clé.
  public <R> Applier<R> apply(Function<? super T, ? extends R> appliable){
Pour cette raison, il est possible de traiter même si l'entrée et la sortie ont des types différents.
Par exemple
System.out.println(
  new Applier<String>("0001")
    .apply(v->Integer.parseInt(v,10))
    .apply(v->v+1)
    .apply(v->String.format("%04d", v))
    .get()
);
Il peut être utilisé comme ça.
personnellement,
    return new Applier<R>(appliable.apply(this.value));
Cette ligne est étrange, alors je veux l'écrire comme ça.
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);
  }
}
L'interface statique publique est utilisée pour empêcher la pollution de l'espace de noms.
Recommended Posts