2017-12-08 45 views
0

스트림 및 forEach를 사용하여이 코드를 Java 8로 쉽게 변환 할 수 있습니까?Java 8 스트림의 코드 변환

List<List<IStitchable>> listOfEnvelopes = new ArrayList<>(); 
List<IStitchable> statementsInEnvelope = new ArrayList<>(); 
int totalPages = 0; 

for(byte[] byteArray :byteArrays){ 
    totalPages = totalPages + getPagesInDocument(byteArray); 

    if(totalPages/2>MAX_SHEETS_FOR_OVERSIZE_ENVELOPE){ 
     totalPages = 0; 
     listOfEnvelopes.add(statementsInEnvelope); 
     tatementsInEnvelope = new ArrayList<IStitchable>(); 
    } 

    statementsInEnvelope.add(createStitchableFromSnapshot(byteArray)); 
} 

나는

byteArrays.stream().forEach(byteArray->{ 
    totalPages = totalPages + getPagesInDocument(byteArray);    
    if(totalPages/2>MAX_SHEETS_FOR_OVERSIZE_ENVELOPE){ 
     totalPages = 0; 
     listOfEnvelopes.add(statementsInEnvelope); 
     statementsInEnvelope = new ArrayList<IStitchable>(); 
    } 
    statementsInEnvelope.add(createStitchableFromSnapshot(byteArray)); 
}); 

처럼 뭔가를 시도했지만 그때 리팩토링 어떤 청소 방법이 그들이 foreach는 범위
마지막에서 액세스 할 수 없습니다 totalPages 및 foreach는 내 statementsInEnvelope, 을 사용할 수 없습니다 이거. 어떤 아이디어라도 감사 할 것입니다.

+0

. 가독성에 대한 영향은 논쟁의 여지가 있습니다. 또한, AtomicInteger (추가 할당, 힙에서 여분의 포인터 역 참조, 휘발성 필드 읽기 및 업데이트)를 사용하는 댓가를 치르고 있습니다. – JnRouvignac

+0

여기에서 "쉬운"일은 커스텀 컬렉터를 회전시키는 것입니다. 그것을 쓰려면 여기에 하나의 참조 예 : https://stackoverflow.com/questions/47645399/java-8-stream-defining-collectors-based-on-other-collectors/47649011#47649011 – Eugene

답변

1

가장 간단한 해결책은 AtomicInteger을 사용하는 것입니다 : 나는 결과 코드는 이전보다 더 나은 여부에 의문을 제기하고있다

List<List<IStitchable>> listOfEnvelopes = new ArrayList<>();  
List<IStitchable> statementsInEnvelope = new ArrayList<>(); 
AtomicInteger totalPages = new AtomicInteger(); 

byteArrays.stream().forEach(byteArray -> { 
    totalPages.addAndGet(getPagesInDocument(byteArray)); 

    if(totalPages.get()/2 > MAX_SHEETS_FOR_OVERSIZE_ENVELOPE){ 
    totalPages.set(0); 
    listOfEnvelopes.add(new ArrayList<>(statementsInEnvelope)); 
    statementsInEnvelope.clear(); 
    } 
    statementsInEnvelope.add(createStitchableFromSnapshot(byteArray)); 
}); 
+0

forEach 내에서 statementsInEnvelope에 액세스하는 문제를 해결하지 못합니다. forEach의 범위 밖에서 선언됩니다. –

+0

'최종'진술 문을 만드시겠습니까? – Ivonet

+0

예, 해결됩니다. 'clear()'에 대한 할당을 변경했음을 기억하십시오. –