2017-10-10 1 views
3

문자열 (현) 중 하나와 객체 (txcArray) 중 하나의 두 개의 스트림 스트림이 있습니다. 두 목록을 반복하고 카운티의 인스턴스를 txcArray의 인스턴스와 비교해야하며 카운터를 증가시키고 일치하지 않으면 계속 진행해야합니다. 나는 자바 8 람다 표현식을 사용하여 이것을 할 필요가 있고 이것은 내가 지금까지 가지고있는 것이다.자바 8 람다 식을 사용하고 카운트를 유지하면서 두 스트림을 반복하는 방법

counties.stream().forEach(a-> { 
    txcArray.stream() 
      .filter(b->b.getCounty().equals(a)) 
      .map(Map<String,Integer>) 
}); 
+1

당신은 "두 목록"이 아니라 "두 목록 스트림"을 가지고 있다고 생각하십니까? 따라서 당신은 당신의 술어와 관련하여 객체의 배열에서 일치하는 문자열 목록에있는 항목의 수만을 계산하고 싶습니까? 그렇다면'.forEach'를 잊어 버리고'.filter'와'.count()'를 먼저 사용하여 해결하십시오. 작동하는 경우, 필터링하기 전에'.map'을 계속하여 객체를 국가 문자열로 변환 할 수 있습니다. 결국 메서드 참조를 사용하려고 할 수도 있습니다. 나는 당신이 해결하려고하는 것에 대해 더 복잡해 보이는 것처럼 Grisha의'zip'에 대한 제안으로 시작하지 않을 것입니다. – Roland

+0

질문을 다시 문구로 봅시다. 유형 문자열 목록과 texasCitiesClass (txcArray) 유형의 또 다른 목록이 있습니다. texasCitiesClass에는 도시 이름, 카운티 및 인구가 포함됩니다. 나는 카운티 목록에 모든 유일한 카운티를 가지고있다. 내가해야 할 일은 카운티의 각 인스턴스가 txcArray에 나타나는 횟수를 확인하고 각 카운티의 해당 숫자를 integer 또는 long 유형의 다른 목록에 추가하는 것입니다. 제약 조건은 스트림과 람다 식을 사용하여이 작업을 수행해야한다는 것입니다. 도와 줘서 고마워, 그리샤와 롤랜드 –

답변

5

실수로 forEach을 사용하고 있습니다.

List<Long> counts = counties.stream() 
    .map(a -> txcArray.stream().filter(b -> b.getCounty().equals(a)).count()) 
    .collect(Collectors.toList()); 

그러나 이것은 매우 효율적이지 않으며 counties.size() × txcArray.size() 작업을 수행합니다. 목록이 더 커지면 손에서 쉽게 벗어날 수 있습니다.

그것은 단일 스트림 동작 아니지만 중간 저장소를 사용하는 경우에도이 바람직하므로, 큰리스트에 더 효율적일 것이다 counties.size() + txcArray.size() 동작들을 수행

Map<String, Long> map = txcArray.stream() 
    .collect(Collectors.groupingBy(b -> b.getCounty(), Collectors.counting())); 
List<Long> counts = counties.stream() 
    .map(a -> map.getOrDefault(a, 0L)) 
    .collect(Collectors.toList()); 

를 사용하는 것이 낫다.