2017-05-20 8 views
1

今日、私はJava 8を学び始めました。だから私はJava 8の新機能です。 私は活動のリストを持っています。アクティビティの名前はstartTime、endTimeです。 startTimeとendTimeについては、私はjoda時間からDateTimeを使用しています。ストリームにdateTime値を追加する方法(java)?

私は、監視期間中に計算された合計期間を各アクティビティについて にマップするMap(String、DateTime)という形式のデータ構造を決定しようとしています。ここで

は、私のコードの抜粋です:

import java.util.ArrayList; 
import java.util.Map; 
import org.joda.time.DateTime; 

class Activity { 
public DateTime startTime; 
public DateTime endTime; 
public String activityLabel; 

public Activity(DateTime startTime, DateTime endTime, String activityLabel) { 
    super(); 
    this.startTime = startTime; 
    this.endTime = endTime; 
    this.activityLabel = activityLabel; 
} 
} 

public class Main { 

public static void main(String[] args) { 
    ArrayList<Activity> list = new ArrayList<>(); 
//adding activities to list 

    list.add(new Activity(new DateTime(2017, 5, 12, 13, 10, 0), new DateTime(2017, 5, 12, 13, 40, 0), "Showering")); 
    list.add(new Activity(new DateTime(2017, 5, 12, 13, 41, 0), new DateTime(2017, 5, 12, 14, 20, 0), "Cooking")); 
    list.add(new Activity(new DateTime(2017, 5, 12, 14, 20, 0), new DateTime(2017, 5, 12, 14, 50, 0), "Eating")); 
    list.add(new Activity(new DateTime(2017, 5, 12, 14, 51, 0), new DateTime(2017, 5, 12, 15, 30, 0), "Sleeping")); 
    list.add(new Activity(new DateTime(2017, 5, 12, 17, 22, 0), new DateTime(2017, 5, 12, 17, 30, 0), "Showering")); 
    list.add(new Activity(new DateTime(2017, 5, 12, 17, 41, 0), new DateTime(2017, 5, 12, 17, 50, 0), "Cooking")); 
    list.add(new Activity(new DateTime(2017, 5, 12, 17, 50, 0), new DateTime(2017, 5, 12, 18, 20, 0), "Eating")); 
    list.add(new Activity(new DateTime(2017, 5, 12, 18, 21, 0), new DateTime(2017, 5, 12, 20, 30, 0), "TV")); 
//creating a stream from list 
    Map<String, DateTime> map; 
// map = list.stream().collect(Collectors.groupingBy(s -> s.activityLabel, Collectors. ... 

} 

}

私は:(この結果を得る方法がわからない、私はさまざまな方法を試してみましたが、私は入手方法を見つけることができませんでした。各アクティビティの合計時間は...私を助けてくれてありがとう

答えて

3

最初のスタートは、Java 8のDateTime APIを使用することがありますビルトインDurationクラス次に、あなたが使用することができます!。。

Map<String, Duration> map = list.stream().collect(
    Collectors.groupingBy(a -> a.activityLabel, 
     Collectors.reducing(Duration.ZERO, 
      a -> Duration.between(a.startTime, a.endTime).abs(), Duration::plus 
     ) 
    )); 

あなたが(代わりにDurationPeriodを使用して)と同じ結果を得ることができますJoda使用するようにしたのでEDIT

は:

Map<String, Period> map = list.stream().collect(
    Collectors.groupingBy(a -> a.activityLabel, 
     Collectors.reducing(Period.ZERO, 
      a -> new Period(a.startTime, a.endTime), Period::plus 
     ) 
    )); 
+0

私はjoda時間からDateTimeを使用する必要があります。それは選択肢ではありません... – SomeoneNew

+0

@FedericoPeraltaSchaffner私は 'groupingBy'操作によって私が捕まったことを認めなければなりません。そして、私はtoMapのアプローチを思いついた。しかし、結局私は 'groupingBy'を使って解決策を考え出しました。 – Flown

+1

@FedericoPeraltaSchaffner私の例を修正しました。とにかく、ヒントありがとう。 – Flown

3

のjava-8 Durationですjoda Durationとは異なります。この方法について:

Map<String, Duration> durations = list.stream().collect(Collectors.toMap(
     it -> it.activityLabel, 
     it -> new Duration(it.startTime, it.endTime), 
     Duration::plus 
)); 
関連する問題