使用 Java 8 Streams 从另一个创建对象列表
我正在尝试理解 Java 8 流.我有两个班级:
I'm trying to understand Java 8 streams. I have two classes:
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
字段应指示是否为一整天的卡路里总和.该字段对于当天的所有条目都是相同的.
The exceed
field should indicate whether the sum of calories for the entire day. This field is the same for all entries for that day.
我尝试从 List<UserMeal> 获取对象mealList
,按天分组,计算一段时间的卡路里,创建List
:
I try to get object from List<UserMeal> mealList
, group by the day, calculate calories for a period of time, and create 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
中创建新对象并返回集合.
but I don't understand how to create new object in forEach
and return collection.
我在伪代码中的看法:
.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
推荐答案
如果你想遍历一个列表并使用转换"对象创建一个新列表,你应该使用 map()
流 + collect()
的函数.在下面的示例中,我找到所有姓氏为l1"的人,以及我映射"到新员工实例的每个人.
If you want to iterate over a list and create a new list with "transformed" objects, you should use the map()
function of stream + collect()
. In the following example I find all people with the last name "l1" and each person I'm "mapping" to a new Employee instance.
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
}
相关文章