중첩 된 목록의 요소별로 목록 그룹화 [중복]
다음과 같은 매개 변수가있는 Car 개체가 있습니다.
private String model;
private BigDecimal price;
private Color color;
private BigDecimal milleage;
private List<String> components;
Car 개체 목록을 만들었습니다.
var cars = List.of(
Car.create("FORD", BigDecimal.valueOf(120000), Color.RED, BigDecimal.valueOf(150000),
List.of("AIR CONDITIONING", "VOICE SERVICE")),
Car.create("FORD", BigDecimal.valueOf(160000), Color.RED, BigDecimal.valueOf(150000),
List.of("AIR CONDITIONING", "VOICE SERVICE")),
Car.create("AUDI", BigDecimal.valueOf(200000), Color.BLACK, BigDecimal.valueOf(195000),
List.of("NAVIGATION", "AUTOMATIC GEARBOX")),
Car.create("FIAT", BigDecimal.valueOf(70000), Color.BLUE, BigDecimal.valueOf(85000),
List.of("AIR CONDITIONING", "MANUAL GEARBOX")));
이제 Map<String, List<Car>>
문자열이 구성 요소 목록의 요소이고이 구성 요소 를 포함 List<Car>>
하는 Car
개체 목록 인 위치 를 만들고 싶습니다 .
비슷한 문제를 기반으로 이와 같은 것을 시도했지만 실제로이 문제를 해결하는 방법을 모릅니다.
static Map<String, List<Car>> carsThatGotComponent(List<Car> cars) {
return cars.stream()
.flatMap(car -> car.getComponents()
.stream()
.map(component -> new AbstractMap.SimpleEntry<>(car, component)))
.collect(Collectors.groupingBy(
Map.Entry::getValue,
Collectors.mapping(Map.Entry::getKey, Map.Entry::getValue)));
}
답변
2 NikolasCharalambidis
Collectors#mapping두 번째 매개 변수 Collector
로 매핑 함수가 아닌 다운 스트림이 필요 합니다.
public static <T,U,A,R> Collector<T,?,R> mapping( Function<? super T,? extends U> mapper, Collector<? super U,A,R> downstream)
Collectors.toList()
대신 사용하고 싶습니다 .
return cars.stream()
.flatMap(car -> car.getComponents()
.stream()
.map(component -> new AbstractMap.SimpleEntry<>(car, component)))
.collect(Collectors.groupingBy(
AbstractMap.SimpleEntry::getValue,
Collectors.mapping(AbstractMap.SimpleEntry::getKey, Collectors.toList())));
만큼 당신이 사용할 때 자바-10 이상, 당신은 사용하여 하나 컬렉터에 전체 스트림을 간단하게 사용할 수있는 Collectors#flatMapping현재의 자바-9 :
return cars.stream()
.collect(Collectors.flatMapping(
car -> car.getComponents()
.stream()
.map(component -> new AbstractMap.SimpleEntry<>(car, component)),
Collectors.groupingBy(AbstractMap.SimpleEntry::getValue,
Collectors.mapping(AbstractMap.SimpleEntry::getKey,
Collectors.toList()))));