2017-05-15 13 views
4

私は、アクティビティとそのアクティビティの合計持続時間を保持するマップを作成しようとしています。ストリームから、javaのDurationフィールドの合計をマップするにはどうすればよいですか?

通常、私はこのようにそれを解決しているだろう:

Map<String,Duration> result2 = new HashMap<String,Duration>(); 
    for(MonitoredData m: lista) 
    { 
     if(result2.containsKey(m.getActivity())) result2.replace(m.getActivity(),result2.get(m.getActivity()).plus(m.getDuration())); 
     else result2.put(m.getActivity(), m.getDuration()); 
    } 

しかし、私は、ストリームでこれを行うにしようとしていますが、私はそこに合計を配置する方法を見つけ出すことはできません。

Function<Duration, Duration> totalDuration = x -> x.plus(x); 
Map<String, Duration> result2 = lista.stream().collect(
         Collectors.groupingBy(MonitoredData::getActivity, 
           Collectors.groupingBy(totalDuration.apply(), Collectors.counting())) 
       ); 

私はそれらを直接マッピングするために、または括弧で直接それらを合計し、グループ化するために、様々な方法で試してみましたが、私はこだわっています。 Mapインターフェースは、それらの一つはmergeのJava 8でのいくつかの素晴らしい追加をされてしまったことに注意し、また

import static java.util.stream.Collectors.toMap; 

Map<String,Duration> result = lista.stream() 
    .collect(toMap(MonitoredData::getActivity, MonitoredData::getDuration, Duration::plus)); 

答えて

4

3-argument versiontoMapのコレクタを使用してください。これを使うと、あなたの反復ループでさえ、もっときれいになるように書き直すことができます:

for (MonitoredData m: lista) { 
    result.merge(m.getActivity(), m.getDuration(), Duration::plus); 
} 
関連する問題