makotan _at_ gmail dot com

Java8 に足りないクラスを作ってみた

きしださんのところでJava8を関数型風に・・・ってのが出てて新しいネタ見つけたな〜って思ったんだけど
それはそれとして、実際にJava8のStream使ったコーディングしてると絶対に欲しくなるのが
Tuple
なんでJDKに標準で入ってないんだ??これから入るのか??みたいなクラス
ちょっと作ったので、晒しとくw


値が二つのTuple2。3つ版も作ったけど増やしただけなので晒さないw

public class Tuple2 {
    public final T1 _1;
    public final T2 _2;

    public Tuple2(T1 t1,T2 t2) {
        _1 = t1;
        _2 = t2;
    }

    public static  Tuple2 t2(T1 t1,T2 t2) {
        return new Tuple2(t1,t2);
    }
}

使い方は・・・Java8のStreamクラス使ったらすぐ判る



あと、例外を何とかしたいなぁ〜って思って作ったクラスとメソッド

@FunctionalInterface
public interface FunctionThrowable {
    /**
     * Compute the result of applying the function to the input argument
     *
     * @param t the input object
     * @return the function result
     */
    R apply(T t) throws Exception;
    
    public static  Function throwable(Logger log , String msg , FunctionThrowable f) {
        return (t) -> {
            try {
                return f.apply(t);
            } catch (Throwable e) {
                log.error(msg,e);
                throw new RuntimeException(e);
            }
        };
    }
}


Functionクラスを引数に取るメソッドに

FunctionThrowable.throwable(logger,"エラーの時に出すメッセージ",(t) -> {return 例外を出すメソッド();})

ってやれば、例外をログに書いてRuntimeExceptionを出して終わり
まぁRuntimeExceptionのままにするのはあんまり良くないので、プロジェクトに合わせて適当に改善した方が良いと思う。