加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java 8列表到地图的转换

发布时间:2020-12-14 19:25:49 所属栏目:Java 来源:网络整理
导读:我将列表对象转换为映射字符串,列表对象时遇到问题.我正在寻找具有汽车中所有组件的键名称的Map,并且值由具有该组件的汽车表示 public class Car { private String model; private ListString components; // getters and setters} 我写了一个解决方案,但正

我将列表对象转换为映射字符串,列表对象时遇到问题.我正在寻找具有汽车中所有组件的键名称的Map,并且值由具有该组件的汽车表示

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;
}
最佳答案
您也可以使用流来做到这一点,但是我发现这更具可读性:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读