🐑
Stream の中間操作で index を扱う
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