2016-05-14 54 views
3

嗨试图找出如何映射到EnumMap没有成功。 目前我正在做2个步骤,我创建了地图,然后将其制作为EnumMap。 问题是。EnumMap&streams

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

回答

8

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. 一个 “组合器”,它有两个值,一个已经存在于所述Map和一个要被添加。在这种情况下,我们只需要输入IllegalArgumentException作为密钥应该是唯一的
  4. “地图供应商” - 这将返回一个新的EnumMap。您的代码

注:

  1. 程序到interface - MapEnumMap
  2. enum是单身,所以你可以使用a != Enum.VALUE
  3. import staticFunction.identity()使事情少详细
+0

感谢您的帮助,我发现forloops比stream更高效。它是否适用于我们正在谈论的地图时,如果我使用相同的方法来代替。它会更快吗? – Hook

+0

@与Java挂钩很难说微型优化是否会更快。由于移动部件少得多,所以简单的循环很可能会更快。我建议你熟悉一下[jmh](http://openjdk.java.net/projects/code-tools/jmh/),并为你的确切代码得到明确的答案。 –