2017-07-19 6 views
2

ラムダ関数内でこのハッシュマップを作成する方法はありますか?ラムダ関数の内部で反復するHashMapを作成するにはどうすればよいですか?

 Map<SaleStatus, Long> sales = new HashMap<>(); 
    saleStatusCounters.forEach(saleStatusCounter -> sales.put(saleStatusCounter.getStatus(), saleStatusCounter.getMatches())); 

このような何か:

 saleStatusCounters.stream() 
      .map(obj -> new HashMap<SaleStatus, Long>().put(obj.getStatus(), obj.getMatches())) 
      .collect(Collectors.toMap(???))); 
+1

[docs](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toMap-java.util.function.Function-java.util)をお読みください。ファンクション - ).... –

+2

実際にここで何をしようとしていますか? 'Collectors.toMap'で十分ではないのはなぜですか? – chrylis

答えて

5

あるとしてあなたのコードは大丈夫です。

Map<SaleStatus, Long> sales = saleStatusCounters.stream() 
    .collect(Collectors.toMap(obj -> obj.getStatus(), obj -> obj.getMatches())); 

注:マップ内で衝突が起こらないよう、これは長いように動作し、すなわち限り、あなたは二つ以上を持っていないとしてあなたは、それにもかかわらず、あなたが望む結果を得るためにストリームを使用してCollectors.toMapすることができます同じステータスを持つ販売ステータスカウンターオブジェクト。

あなたが同じ状況で、あなたのリストの1つの要素が複数ある場合は、あなたがCollectors.toMap that expects a merge functionのオーバーロードされたバージョンを使用する必要があります

Map<SaleStatus, Long> sales = saleStatusCounters.stream() 
    .collect(Collectors.toMap(
     obj -> obj.getStatus(), 
     obj -> obj.getMatches(), 
     Long::sum)); 

をここLong::sumはにマッピングされている2つの値をマージしBinaryOperator<Long>です同じキー。

+1

または 'SaleStatus :: getStatus、SaleStatus :: getMatches'? – chrylis

+0

@chrylisまあ、私はクラスの名前を持っていない、 'SaleStatus'は' getStatus() 'メソッドが返すものです。 –

+0

そうですね、私はGroovyの土地に長年住んでいます。それはすべて私のものです。 – chrylis

関連する問題