2017-10-29 55 views
5

Mam List<UserMeal> kolekcję, gdzie UserMeal posiada:Collectors.toMap() keyMapper

public class UserMeal { 
private final LocalDateTime dateTime; 
private final int calories; 

public UserMeal(LocalDateTime dateTime, int calories) { 
    this.dateTime = dateTime; 
    this.calories = calories; 
} 

public LocalDateTime getDateTime() { 
    return dateTime; 
} 

public int getCalories() { 
    return calories; 
} 
} 

muszę przekształcić go w Map<LocalDate, Integer>.

Kluczem mapy musi być dateTime (przekonwertowany na) elementu UserMeal w kolekcji.

Wartość mapy musi być sumą calories.

Nie mogę określić, jak to zrobić w przypadku strumieni. Coś takiego:

items.stream().collect(Collectors.toMap(...)); 

Każda pomoc?

Oto mój obecny kod, który oczywiście nie działa.

Map<LocalDate, Integer> values = mealList.stream() 
      .collect(Collectors.toMap(m->m.getDateTime().toLocalDate(), 
        m-> {/* HUH? */})); 

Odpowiedz

5

Trzeba inny Collector:

Map<LocalDate, Integer> values = mealList.stream() 
     .collect(Collectors.groupingBy(
       m -> m.getDateTime().toLocalDate(), 
       Collectors.summingInt(UserMeal::getCalories))); 

Albo można użyć Collectors.toMap że ma jeszcze jeden argument, który opowiada, jak scalić wpisy.