2017-05-20 1 views
1

Heute habe ich angefangen Java 8 zu lernen, also bin ich ziemlich neu in Java 8 und es sind Sachen. Ich habe eine Liste von Aktivitäten. Eine Aktivität hat den Namen startTime und endTime. Für StartTime und EndTime verwende ich DateTime von joda Zeit.Wie fügt man dateTime-Werte in einen Stream (Java) ein?

Ich versuche eine Datenstruktur des Formulars Map (String, DateTime) zu ermitteln, die für jede Aktivität die gesamte über den Überwachungszeitraum berechnete Dauer abbildet.

Hier ein Ausschnitt aus meinem Code ist.

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. ... 

} 

}

Ich weiß nicht, wie dieses Ergebnis :(I zu erhalten versucht, verschiedene Methoden und ich konnte nicht herausfinden, wie zu erhalten die Gesamtdauer für jede Aktivität ... Vielen Dank für mich zu helfen

Antwort

3

Erster Start Java 8 Datetime-API zu verwenden, gibt es eine eingebaute in Duration Klasse Dann können Sie verwenden:..

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

EDIT

Da Sie verwenden Joda haben, können Sie die gleichen Ergebnisse mit bekommen (mit Period statt Duration):

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

Ich muss DateTime von joda Zeit verwenden. Es ist keine Wahl ... – SomeoneNew

+0

@FedericoPeraltaSchaffner Ich muss zugeben, dass ich von der Operation "groupingBy" abgefangen wurde. Dann kam ich mit dem 'toMap'-Ansatz. Aber am Ende wollte ich mit 'groupingBy' eine Lösung finden. – Flown

+1

@FedericoPeraltaSchaffner Mein Beispiel korrigiert. Wie auch immer, danke für den Hinweis. – Flown

3

java-8 Duration ist anders mit joda Duration. Wie wäre es damit:

Map<String, Duration> durations = list.stream().collect(Collectors.toMap(
     it -> it.activityLabel, 
     it -> new Duration(it.startTime, it.endTime), 
     Duration::plus 
)); 
Verwandte Themen