2017-11-08 8 views
1

는 .... 것 같다 :) 여기 com.google.common.collect.Iterables.partition을 사용하여 Java 8 방식으로 반복 하시겠습니까? 이 아직 어떤 방식으로 <code>Stream.of</code>를 사용하여 간단하고 있어야처럼

내가 개선하고자하는 코드 ( 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