Преобразование списка Java 8 в карту - PullRequest
0 голосов
/ 11 февраля 2019

У меня проблема с преобразованием List Object в Map String, List Object.Я ищу Карту с именами ключей всех компонентов в автомобилях, и значение представлено автомобилями с этим компонентом

public class Car {
    private String model;
    private List<String> components;
    // getters and setters
}

Я пишу решение, но ищу лучшее потоковое решение.

public Map<String, List<Car>> componentsInCar() {
    HashSet<String> components = new HashSet<>();
    cars.stream().forEach(x -> x.getComponents().stream().forEachOrdered(components::add));
    Map<String, List<Car>> mapCarsComponents  = new HashMap<>();
    for (String keys : components) {
        mapCarsComponents.put(keys,
                cars.stream().filter(c -> c.getComponents().contains(keys)).collect(Collectors.toList()));
    }
    return mapCarsComponents;
}

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Я знаю, что это вопрос Java, и уже есть ответ Java.Однако я хотел бы добавить, что Kotlin, который является языком JVM и прекрасно взаимодействует с Java, позволяет очень просто и аккуратно делать такие вещи:

val carsByComponent = cars
    .flatMap { it.components }
    .distinct()
    .map { component -> component to cars.filter { car -> component in car.components } }
    .toMap()

или даже более кратко, хотя и менее читабельно:

val carsByComponent = cars
    .flatMap { car -> car.components.map { it to car } }
    .groupBy { it.first }
    .mapValues {it.value.map { it.second }}
0 голосов
/ 11 февраля 2019

Вы можете сделать это и с потоками, но я нахожу это немного более читабельным:

public static Map<String, List<Car>> componentsInCar(List<Car> cars) {
    Map<String, List<Car>> result = new HashMap<>();
    cars.forEach(car -> {
        car.getComponents().forEach(comp -> {
            result.computeIfAbsent(comp, ignoreMe -> new ArrayList<>()).add(car);
        });
    });

    return result;
}

Или используя поток:

public static Map<String, List<Car>> componentsInCar(List<Car> cars) {
    return cars.stream()
               .flatMap(car -> car.getComponents().stream().distinct().map(comp -> new SimpleEntry<>(comp, car)))
               .collect(Collectors.groupingBy(
                   Entry::getKey,
                   Collectors.mapping(Entry::getValue, Collectors.toList())
               ));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...