如何从Java中的对象列表中获取单个对象

时间:2018-05-22 14:43:48

标签: java list arraylist

我有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。

3 个答案:

答案 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();

当然,您可以在变量,参数中声明年份,从命令行中读取它,...以便不对其进行硬编码。