2017-11-08 13 views
1

これはいくつかの方法でStream.ofを使用して簡単であるべきように思える、とまだ.... :)Java 8の方法は、com.google.common.collect.Iterables.partitionを使ってループしますか?

ここで私は改善したいコードは(myEntryIdsの長さがLong数千項目のリストである)である:

List<MyEntityType> results = new ArrayList<>(); 

// batch up into groups of 1000 
for (final List<Long> partitionedEntryIds : 
     com.google.common.collect.Iterables.partition(myEntryIds, 1000)) { 
     results.addAll(BeanConverter.convertList(
      myJpaRepository.findAll(partitionedEntryIds))); 
} 

return results; 
+0

このコードは簡単でわかりやすく表示されます(完全修飾されたクラス名を除く)。なぜそれを変更したいのですか? –

+0

FQCNは読みやすくするためのものでした。私は理由の包括的なリストを持っていませんが、私は "結果"の変更可能性を嫌います。これが並列性の候補になる可能性があるのか​​どうかは確かではありませんが、現在の状態は間違いありません。 – JoeG

+1

並列処理はできません。同じトランザクションですべてのクエリを実行し、トランザクションがスレッドにバインドされ、エンティティがスレッドセーフではないようにします。また、collect(toList())は、変更可能なArrayListを使用して返します。 Sothereはその点で何の違いもありません。 –

答えて

4

ありJDKにはIterables#partition同等ストリームないのですが、あなたはあなたの他の目標を達成するためにStreams#streamヘルパーとグアバ(プラス私は個人的に好きないくつかのメソッド参照)からtoImmutableList()コレクタを使用することができます。

final List<MyEntityType> myEntityTypes = Streams.stream(
    Iterables.partition(myEntryIds, 1000)) 
    .map(myJpaRepository::findAll) 
    .map(BeanConverter::convertList) 
    .flatMap(List::stream) 
    .collect(toImmutableList()); 
+0

非常に良い!ありがとう! – JoeG

関連する問題