EnumMap&流

时间:2016-05-14 11:08:24

标签: java collections enums java-8 java-stream

您好想弄清楚如何映射到EnumMap但没有成功。 目前我分2步完成,我创建了地图,然后将其设为EnumMap。 问题是。

  1. 是否可以只在一步中完成?
  2. 从效率角度来看,获取价值观会更好 输入,使它们成为集合然后流式传输,或者只使用toMap作为 它现在是正确的。感谢

    Map<CarModel, CarBrand> input...  
    final Map<CarBrand, CarsSellers> ret = input.values()
                .stream().filter(brand -> !brand.equals(CarBrand.BMW))
                .collect(toMap(Function.identity(), brand -> new CarsSellers(immutableCars, this.carsDb.export(brand))));
    
     final EnumMap<CarBrand, CarsSellers> enumMap = new EnumMap<>(CarBrand.class);
        enumMap.putAll(ret);
    

1 个答案:

答案 0 :(得分:10)

TL; DR:您需要使用other toMap method

默认情况下,toMap使用HashMap::new作为Supplier<Map> - 您需要提供新的EnumMap

final Map<CarBrand, CarsSellers> ret = input.values()
        .stream()
        .filter(brand -> brand != CarBrand.BMW)
        .collect(toMap(
                identity(),
                brand -> new CarsSellers(immutableCars, this.carsDb.export(brand)),
                (l, r) -> {
                    throw new IllegalArgumentException("Duplicate keys " + l + "and " + r + ".");
                },
                () -> new EnumMap<>(CarBrand.class)));

参数是:

  1. key提取器
  2. value提取器
  3. a&#34; mergeFunction&#34;这需要两个值,一个已经存在于Map中,另一个要添加。在这种情况下,我们只需抛出一个IllegalArgumentException,因为键应该是唯一的
  4. &#34;地图供应商&#34; - 这会返回一个新的EnumMap
  5. 您的代码备注:

    1. 计划到interface - Map而不是EnumMap
    2. enum是单身,因此您可以使用a != Enum.VALUE
    3. import static Function.identity()使{更简洁