3
List
에 각각 Map
이있는 클래스가 있다고 가정 해 봅니다. Map
에Java 8 스트림 - 맵을 병합하고 "값"의 평균을 계산합니다.
public class Test {
public Map<Long, Integer> map;
}
Long
키는 타임 스탬프이며 Integer
값 점수이다.
Long
들) 및 평균 점수와
Map
에서지도를 결합 할 수있는
Stream
을 만들려고하고 있습니다.
나는이 코드를 가지고 있지만, 그것은 나에게 모든 점수의 합 등을 제공하지 평균합니다 (Integer
클래스는 평균 방법이 없습니다).
Test test1 = new Test();
test1.map = new HashMap() {{
put(1000L, 1);
put(2000L, 2);
put(3000L, 3);
}};
Test test2 = new Test();
test2.map = new HashMap() {{
put(1000L, 10);
put(2000L, 20);
put(3000L, 30);
}};
List<Test> tests = new ArrayList() {{
add(test1);
add(test2);
}};
Map<Long, Integer> merged = tests.stream()
.map(test -> test.map)
.map(Map::entrySet)
.flatMap(Collection::stream)
.collect(
Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
Integer::sum
)
);
System.out.println(merged);
것은 나는이 쉬운 문제가 너무 너무 고유의 타임 스탬프와 Map
모든 점수의 List
과 출력도 괜찮을 것, 하나의 Stream
에 해결되지 않을 수도 있음을 생각하고 있어요. 그렇다면 평균을 계산할 수 있습니다.
Map<Long, List<Integer>>
가능한가요? 대신 Collectors.groupingBy
사용 Collectors.toMap
의
고마워요. – Martin
제 생각 엔 항상 메소드 참조를 사용하려고 시도 할 필요는 없습니다. .map (test :: test.map) .map (Map :: entrySet) .flatMap (Collection :: stream)보다 간단하다.'.flatMap (test -> test.map.entrySet(). stream())' ', imho – Holger
@Holger 동의합니다. 나는 그것이 문제가 아니기 때문에 나는 파이프 라인의 그 부분에 집중하지 않고 그대로 유지했다는 것을 인정해야한다. – Eran