Listeyi iç içe geçmiş listenin öğelerine göre grupla [yinelenen]
Aşağıdaki gibi parametrelere sahip Araba nesnesine sahibim:
private String model;
private BigDecimal price;
private Color color;
private BigDecimal milleage;
private List<String> components;
Araba nesnelerinin listesini oluşturdum:
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")));
Şimdi Map<String, List<Car>>
dizenin bileşen listesinin öğesi olduğu ve bu bileşeni içeren nesnelerin List<Car>>
listesi olduğu yerde oluşturmak istiyorum Car
.
Bazı benzer problemlere dayanarak buna benzer bir şey denedim ama bu problemi nasıl çözeceğimi gerçekten bilmiyorum:
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)));
}
Yanıtlar
2 NikolasCharalambidis
Collectors#mappingikinci bir parametre olarak bir alt akış gerektirir Collector
, bir eşleme işlevini değil.
public static <T,U,A,R> Collector<T,?,R> mapping( Function<? super T,? extends U> mapper, Collector<? super U,A,R> downstream)
Bunun Collectors.toList()
yerine kullanmak istiyorsunuz :
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())));
Java-10 veya sonraki bir sürümünü kullandığınız sürece Collectors#flatMapping, java-9'dan itibaren tüm Akışı tek bir toplayıcıda basitleştirmeyi kullanabilirsiniz :
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()))));
Donovan, Şarkılarından 1'ini The Beatles'ın "Lucy in the Sky with Diamonds" şarkısıyla karşılaştırdı
Tom Girardi Dolandırıcılık Suçlamalarından Yargılanma Yetkisinin Belirlenmesi İçin Duruşmaya Katıldı
Kevin Jonas'ın Kızı Alena, Doğum Günü Fotoğrafında Büyümüş Görünüyor: '9 Yaşında Gerçek Hissetmiyor'