使用java8流创建另一个对象列表

我正在尝试理解Java 8流。 我有两节课:

public class UserMeal { protected final LocalDateTime dateTime; protected final String description; protected final int calories; public UserMeal(LocalDateTime dateTime, String description, int calories) { this.dateTime = dateTime; this.description = description; this.calories = calories; } public LocalDateTime getDateTime() { return dateTime; } public String getDescription() { return description; } public int getCalories() { return calories; } } 

和:

 public class UserMealWithExceed { protected final LocalDateTime dateTime; protected final String description; protected final int calories; protected final boolean exceed; public UserMealWithExceed(LocalDateTime dateTime, String description, int calories, boolean exceed) { this.dateTime = dateTime; this.description = description; this.calories = calories; this.exceed = exceed; } } 

exceed字段应指示整天的卡路里总和。 该字段对于当天的所有条目都是相同的。

我尝试从List mealList获取对象,按天分组,计算一段时间的卡路里​​,并创建List

 public static List getFilteredMealsWithExceeded(List mealList, LocalTime startTime, LocalTime endTime, int caloriesPerDay) { return mealList.stream() .filter(userMeal -> userMeal.getDateTime().toLocalTime().isAfter(startTime)&&userMeal.getDateTime().toLocalTime().isBefore(endTime)) .collect(Collectors.groupingBy(userMeal -> userMeal.getDateTime().getDayOfMonth(), Collectors.summingInt(userMeal -> userMeal.getCalories()))) .forEach( ????? ); } 

但我不明白如何在forEach创建新对象并返回集合。

我怎么看伪代码:

 .foreach( if (sumCalories>caloriesPerDay) {return new UserMealWithExceed(userMeal.getdateTime, usermeal.getDescription, usermeal.getCalories, true);} else {return new UserMealWithExceed(userMeal.getdateTime, usermeal.getDescription, usermeal.getCalories, false) } )//foreach 

如果要迭代列表并使用“已转换”对象创建新列表,则应使用stream + collect()map()函数。 在下面的示例中,我找到姓氏为“l1”的所有人以及每个人“映射”到新的Employee实例。

 public class Test { public static void main(String[] args) { List persons = Arrays.asList( new Person("e1", "l1"), new Person("e2", "l1"), new Person("e3", "l2"), new Person("e4", "l2") ); List employees = persons.stream() .filter(p -> p.getLastName().equals("l1")) .map(p -> new Employee(p.getName(), p.getLastName(), 1000)) .collect(Collectors.toList()); System.out.println(employees); } } class Person { private String name; private String lastName; public Person(String name, String lastName) { this.name = name; this.lastName = lastName; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } } class Employee extends Person { private double salary; public Employee(String name, String lastName, double salary) { super(name, lastName); this.salary = salary; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } } 

您可能正在寻找的是map() 。 您可以通过以下方式映射将流中的对象“转换”为另一个:

 ... .map(userMeal -> new UserMealExceed(...)) ...