Collectors#mapping
requires as a second parameter a downstream Collector
, not a mapping function.
public static <T,U,A,R> Collector<T,?,R> mapping(
Function<? super T,? extends U> mapper,
Collector<? super U,A,R> downstream)
You want to use Collectors.toList()
instead:
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())));
As long as you use java-10 or later, you can use simplify the whole Stream into one collector using Collectors#flatMapping
as of 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()))));
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…