🌊

javaでwith(obj)的な事をする

2023/03/12に公開

発想は超簡単です。関数型インターフェース使うだけです。

使い方

MapperSupport.with(anyObj, (obj -> {
    return obj.getId();
});

staticフィールドを使いたい場合(前回の記事でMyBatis使ったコードの煩雑性を軽減したかったので)

MapperSupport.with(new AnyClass(), (obj -> {
    return obj.id;    // これは警告出ます、staticフィールドへの直接アクセスである場合
});

前回の記事を置き換えたコードです。

public List<History> findLaterHistory() {
    return historyMapper.selectMany(
        MapperSupport.with(new HistoryDynamicSqlSupport(), (s ->
            select(
                s.id,
                s.name,
                max(s.updated)      // ここが重要
            )
            .from(s.history)
            .groupBy(s.name)
            .build()
            .render(RenderingStrategies.MYBATIS3)
	)
    );
}

with定義クラスです。

import java.util.function.Function;

public class MapperSupport {
    public static <T, R> R with(T obj, Function<T, R> f) {
        return f.apply(obj);
    }
}

Discussion