当前位置: 首页 > 知识库问答 >
问题:

Java8列表到映射的转换

公西马鲁
2023-03-14

我有一个问题与转换列表对象映射字符串,列表对象。我正在寻找与一个关键名称的汽车所有组件的地图,一个值由汽车与此组件表示

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;
}

共有1个答案

洪景铄
2023-03-14

您也可以使用流来完成,但我发现这更容易理解:

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())
               ));
}
 类似资料:
  • 问题内容: 我有一个带有以下签名的类: 我想要一个来自a 的键,该键将是该类的名称。我如何使用java8流按es名称对列表进行分组?所有es在名称上都是唯一的。 可以在单个流中求解,还是应该以某种方式拆分它还是采用经典解决方案? 问题答案:

  • 我有映射键作为字符串和值作为列表。列表可以有10个唯一值。我需要转换这个映射键为整数和值为列表。示例如下: 输入: 2:“钥匙-1”,“钥匙-2” 3:“钥匙-1”、“钥匙-2”、“钥匙-3” 4:“钥匙-1”、“钥匙-2”、“钥匙-3”

  • 我有map,我想有一个列表,它按键的对应值排序(最小到最大)。我的尝试是:

  • 我在迭代一个对象内的列表时遇到了一个问题,该对象内嵌在另一个映射中。我的目标是迭代这个列表并生成一个映射 ,我希望使用streams和lamdas来实现这一点。 我在上面看到了,我需要通过迭代FolderBo中的elementList从elementBo创建一个带有map 的映射。folderBo本身就在Modelbo的地图内。

  • 我有一个从RESTendpoint返回的列表。我需要将该列表分为多个类别(类别是列表中每个条目中的一个项目)。各个类别将写入缓存,以便以后更快地查找。 我不知道我能不能。映射()条目,并提供多个filter()或某种类型的case语句,以将类别条目放入正确的bucket中。 用rxJava实现这样的东西听起来合理吗? 更新:非工作版本 然而,这些按顺序触发,这是我的理解,第二个可观察对象没有发送任

  • 我已经创建了一种计算字母表中每个字符的方法。我正在学习流(函数式编程),并尝试尽可能经常地使用它们,但我不知道在这种情况下该怎么做: