77import java .time .LocalDateTime ;
88import java .time .LocalTime ;
99import java .time .Month ;
10- import java .util .Arrays ;
11- import java .util .List ;
12- import java .util .Map ;
10+ import java .util .*;
1311import java .util .stream .Collectors ;
1412
13+ import static ru .javawebinar .topjava .util .TimeUtil .isBetweenHalfOpen ;
14+
1515public class MealsUtil {
1616 public static void main (String [] args ) {
1717 List <Meal > meals = Arrays .asList (
@@ -24,8 +24,13 @@ public static void main(String[] args) {
2424 new Meal (LocalDateTime .of (2020 , Month .JANUARY , 31 , 20 , 0 ), "Ужин" , 410 )
2525 );
2626
27- List <MealTo > mealsTo = filteredByStreams (meals , LocalTime .of (7 , 0 ), LocalTime .of (12 , 0 ), 2000 );
27+ final LocalTime startTime = LocalTime .of (7 , 0 );
28+ final LocalTime endTime = LocalTime .of (12 , 0 );
29+
30+ List <MealTo > mealsTo = filteredByStreams (meals , startTime , endTime , 2000 );
2831 mealsTo .forEach (System .out ::println );
32+
33+ System .out .println (filteredByCycles (meals , startTime , endTime , 2000 ));
2934 }
3035
3136 public static List <MealTo > filteredByStreams (List <Meal > meals , LocalTime startTime , LocalTime endTime , int caloriesPerDay ) {
@@ -36,11 +41,25 @@ public static List<MealTo> filteredByStreams(List<Meal> meals, LocalTime startTi
3641 );
3742
3843 return meals .stream ()
39- .filter (meal -> TimeUtil . isBetweenHalfOpen (meal .getTime (), startTime , endTime ))
44+ .filter (meal -> isBetweenHalfOpen (meal .getTime (), startTime , endTime ))
4045 .map (meal -> createTo (meal , caloriesSumByDate .get (meal .getDate ()) > caloriesPerDay ))
4146 .collect (Collectors .toList ());
4247 }
4348
49+ public static List <MealTo > filteredByCycles (List <Meal > meals , LocalTime startTime , LocalTime endTime , int caloriesPerDay ) {
50+
51+ final Map <LocalDate , Integer > caloriesSumByDate = new HashMap <>();
52+ meals .forEach (meal -> caloriesSumByDate .merge (meal .getDate (), meal .getCalories (), Integer ::sum ));
53+
54+ final List <MealTo > mealsTo = new ArrayList <>();
55+ meals .forEach (meal -> {
56+ if (isBetweenHalfOpen (meal .getTime (), startTime , endTime )) {
57+ mealsTo .add (createTo (meal , caloriesSumByDate .get (meal .getDate ()) > caloriesPerDay ));
58+ }
59+ });
60+ return mealsTo ;
61+ }
62+
4463 private static MealTo createTo (Meal meal , boolean excess ) {
4564 return new MealTo (meal .getDateTime (), meal .getDescription (), meal .getCalories (), excess );
4665 }
0 commit comments