LoginSignup
1
1

More than 3 years have passed since last update.

javaで配列を使わずにmapする

Last updated at Posted at 2019-07-23

先日こんな記事を書いた。

ネストしすぎの()を何とかしたい
https://qiita.com/tkturbo/items/04960f4e3e7226de3b46

ここで書いた、

// 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);

今日はこれをjava化してみる。

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; }
}

java.util.function.Functionインタフェースを使えばこの通り。

キモになるのはこの1行。

  public <R> Applier<R> apply(Function<? super T, ? extends R> appliable){

これがあるので、入力と出力で型が違っても処理可能となる。

例えば、

System.out.println(
  new Applier<String>("0001")
    .apply(v->Integer.parseInt(v,10))
    .apply(v->v+1)
    .apply(v->String.format("%04d", v))
    .get()
);

こんな風に使える。

個人的には、

    return new Applier<R>(appliable.apply(this.value));

この1行に違和感あるので、こう書きたい所。

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);
  }
}

public staticなインタフェースを使ってるのは名前空間の汚染を抑止するため。

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1