我有User对象列表,我只想根据User对象中的变量从List中获取Collect对象。
public class User {
private int id;
private String sex;
private int year;
private int value;
/**
* Getter and setter for all variables
*/
}
我有这样的模型类。现在我有一个User对象列表。
List<User> users = new ArrayList<User>();
我想创建一个包含月薪所有值之和的单个对象
List<Collect> objList = new ArrayList<Collect>();
for(User object : users) {
if(object.getyear().equals("2013")){
ageList.add(object);
}
}
但我不确定它是如何运作的。由于同一年可能有多个条目,我想将同一年的所有值相加并放入收集对象
有什么方法可以从对象列表中创建单个对象,还可以根据对象列表中的同一年执行求和操作。另外,不要为检查年份硬编码2013。
答案 0 :(得分:2)
执行此操作的必要方法,而不是简化的方法,是使用类似于您已经执行过的方式的for循环。
然而,你可以做些什么,以获得你想要的所有年份的列表,所以你不需要硬编码,这是双重的。首先,我会为年份和工资总额创建一个地图(如果没有松散地输入Map<Year, Salary>
,尽管这可能采用Map<Integer, Integer>
形式。
Map<Integer, Integer> map = new HashMap<>();
然后,我将浏览用户列表,初始化HashMap
的值,并在单个循环中将值添加到HashMap
中的初始化值。
for (User u : users)
if (map.containsKey(u.getYear()))
map.put(u.getYear(), map.get(u.getYear()) + u.getSalary());
else map.put(u.getYear(), 0);
然后地图将包含您想要的年份总和。您可以通过查询map.get(year)
来获取它们。
答案 1 :(得分:1)
所以你想在每年的总和,这里的方式:
Map<Integer, Integer> totalValuePerYear = users.stream()
.collect(groupingBy(User::getYear, summingInt(User::getValue)));
如果要将其收集到对象,例如:
public class SumPerYear {
private int year;
private int sum;
// Getter, setter, constructor
}
您可以更进一步:
List<SumPerYear> result = users.stream()
.collect(groupingBy(User::getYear, summingInt(User::getValue)))
.entrySet().stream()
.map(e -> new SumPerYear(e.getKey, e.getValue))
.collect(toList());
答案 2 :(得分:0)
您可以使用IntStream
:
long totalSum = users.stream()
.filter(user -> user.getYear() == 2013))
.mapToInt(User::getValue)
.sum();
当然,您可以在变量,参数中声明年份,从命令行中读取它,...以便不对其进行硬编码。