Kelompokkan daftar berdasarkan elemen daftar bertingkat [duplikat]
 Jan 25 2021
Saya punya objek Car dengan parameter seperti:
private String model;
private BigDecimal price;
private Color color;
private BigDecimal milleage;
private List<String> components;
 
    Saya membuat daftar objek Mobil:
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")));
 
    Sekarang saya ingin membuat di Map<String, List<Car>>mana string adalah elemen daftar komponen dan List<Car>>daftar Carobjek yang berisi komponen ini.
Saya mencoba sesuatu seperti ini berdasarkan beberapa masalah serupa tetapi benar-benar tidak tahu bagaimana mengatasi masalah ini:
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)));
}
Jawaban
2  NikolasCharalambidis Jan 25 2021 at 19:15
Collectors#mappingmembutuhkan sebagai parameter kedua Collector, hilir , bukan fungsi pemetaan.
public static <T,U,A,R> Collector<T,?,R> mapping( Function<? super T,? extends U> mapper, Collector<? super U,A,R> downstream)
Anda ingin menggunakan Collectors.toList()sebagai gantinya:
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())));
 
     Selama Anda menggunakan java-10 atau lambat, Anda dapat menggunakan menyederhanakan seluruh Streaming ke dalam satu kolektor menggunakan Collectors#flatMappingpada java-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()))));
Kiat Pemilik Anjing yang Bermanfaat: Mengapa Penting untuk Membiarkan Anjing Anda Mengendus di Jalan
Taylor Sheridan Baru Menambahkan 1 Bintang 'Yellowstone' Favoritnya ke Pemeran 'Lawmen: Bass Reeves'