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

我正在尝试理解 Java8流。 我有两门课:

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<UserMeal> mealList中获取物体,按天分组,计算一段时间的卡路里,然后创建 List<UserMealWithExceed>:

public static List<UserMealWithExceed>  getFilteredMealsWithExceeded(List<UserMeal> 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
265605 次浏览

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

public class Test {


public static void main(String[] args) {
List<Person> persons = Arrays.asList(
new Person("e1", "l1"),
new Person("e2", "l1"),
new Person("e3", "l2"),
new Person("e4", "l2")
);


List<Employee> 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;
}


// Getter & Setter
}


class Employee extends Person {


private double salary;


public Employee(String name, String lastName, double salary) {
super(name, lastName);
this.salary = salary;
}


// Getter & Setter
}

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

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

作者:@Rafael Teles。句法糖 Collectors.mapping在一个步骤中做同样的事情:

//...
List<Employee> employees = persons.stream()
.filter(p -> p.getLastName().equals("l1"))
.collect(
Collectors.mapping(
p -> new Employee(p.getName(), p.getLastName(), 1000),
Collectors.toList()));

详细的例子可以找到 给你