🐑

Stream の中間操作で index を扱う

2022/12/23に公開

Stream で配列の index を扱う

下記のような、配列の要素に連番を振る(降る?)処理を stream で書き換える

// sample テーブルは表示順を表現する sort カラムを持っている
// 削除などで sort に穴が空いた場合、それを詰める必要があるというストーリー
List<SampleEntity> entities = sampleRepository.findByUserId(userId);
List<SampleEntity> sortAdjustedEntities= new ArrayList();
for(int i = 0; i <= list.size() - 1; i++) {
    SampleEntity entity = list.get(i);
    entity.setSort(index + 1);
    sortAdjustedEntities.add(entity);
}
sampleRepository.save(sortAdjustedEntities);

stream で書き換えたのが下記

List<SampleEntity> entities = sampleRepository.findByUserId(userId);
List<SampleEntity> sortAdjustedEntities =
    IntStream.range(0, entities.size())
        .mapToObj(
            index -> {
                SampleEntity entity = entities.get(index);
                entity.setSort(index + 1)
                return entity;
            })
        .collect(Collectors.toList());
sampleRepository.save(sortAdjustedEntities);

IntStream.range は、for のカッコ内のおぞましさを隠してくれる。
mapToObj メソッドを使うことで、任意のオブジェクトを返して終端操作でリストにできる。

index 扱う = stream に書き換えられないと思っていたので、学びになった。

Discussion