怠惰系エンジニアのメモ帳

勉強した内容をメモしていきます。解説ブログではないので悪しからず。

【SpringWebFlux + Doma2】T型をFlux<T>に変換するCollector

SpringWebFlux + Doma2 で開発していて、Daoの戻り値を Flux<T> にしたかったので Flux<T> に変換する Collector 作った話。
当たり前だが、DomaのDaoメソッドは戻り値を Flux<T> で返せない。

@Dao
public interface PersonDao {
    @Select
    Flux<Person> findAll(); // これダメ
}

かと言って、List<Person>Stream<Person> で受け取りたくない。
となると、Domaのコレクト検索機能(もしくはストリーム検索)を利用して Flux<T> に変換する。

@Dao
public interface PersonDao {
    @Select(strategy = COLLECT)
    <R> R findAll(final Collector<Person, ?, R> collector);
}

Domaはこのコレクト検索が強い。良い。
で、作った Collector が以下。

public class PublisherCollectors {
    public static <T> Collector<T, ?, Flux<T>> toFlux() {
        return Collector.<T, List<T>, Flux<T>>of(
                ArrayList::new, 
                List::add,
                (right, left) -> { right.addAll(left); return right; },
                Flux::fromIterable
        );
    }
}
PersonDao personDao = // ...
Flux<Person> fluxPerson = personDao.findAll(PublisherCollectors.toFlux());

一旦 List に全ての要素を突っ込んで、最後に Flux に変換する方法をとった。
※本当は頭からケツまで Flux で処理したかったが、上手くいかなかった。

ちなみにストリーム検索を利用して Flux<T> に変換する場合は、

@Dao
public interface PersonDao {
    @Select(strategy = STREAM)
    <R> R findAll(final Function<Stream<Person>, R> function);
}
Flux<Person> fluxPerson = personDao.findAll(Flux::fromStream);

とする。

最後に

頭から Flux で処理できる方法や、良いライブラリがあったら教えていただけると嬉しいです。