2016-05-14 11 views
3

こんにちは、こんにちは、EnumMapにマップする方法を理解してみました。 私は2つのステップでそれをやっている瞬間、マップを作成してEnumMapにします。質問はありますか?EnumMap&streams

  1. 1ステップで行うことはできますか?
  2. 入力から値を取得し、それをストリームにしたり、単にストリームを使用して という値を取得したほうが効率的です。おかげ

    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を使用する必要があります。

デフォルトでは、toMapSupplier<Map>としてHashMap::newを使用します。代わりに新しい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. 既にMapに存在し、1つが追加される2つの値の一つを取るvalue抽出
  3. 「コンバイナ」。この場合、キーが一意である必要があるため、IllegalArgumentExceptionを投げるだけです。
  4. 「マップサプライヤ」 - これは新しいEnumMapを返します。あなたのコードの

注:

  1. プログラムinterfaceへ - MapないEnumMap
  2. enumあなたはa != Enum.VALUE
  3. Function.identity()ためimport staticは物事が少なくなりを使用することができますので、シングルトンであります冗長
+0

助けてくれてありがとう、forloopsはストリームよりも効率的だと私は読む。私がto toについて話しているときに適用されますか?それは速くなるでしょうか? – Hook

+0

@Hook with Javaこれは、マイクロ最適化が高速になるかどうかを言うのは非常に難しいです。単純なループ_は、移動部品の数が少ないために高速になる可能性が非常に高いです。 [jmh](http://openjdk.java.net/projects/code-tools/jmh/)に慣れて、あなたの正確なコードを明確にすることをお勧めします。 –

関連する問題