文章目录
- 方法1:使用mapToInt和sum
- 方法2:使用reduce方法
- 方法3:使用collect和summingInt(Java 8或更高版本)
在Java中,使用Stream API可以方便地处理集合数据,包括计算某个字段的累计和。假设你有一个对象列表,并且你想计算这些对象中某个字段的累计和,你可以通过以下几种方式实现:
示例对象
首先,假设你有一个类Person,它有一个age字段:
publicclassPerson{privateStringname;privateintage;// 构造函数publicPerson(Stringname,intage){this.name=name;this.age=age;}// Getter 和 SetterpublicStringgetName(){returnname;}publicintgetAge(){returnage;}}方法1:使用mapToInt和sum
如果你想要计算所有人的年龄总和,可以使用mapToInt将Person对象流转换成年龄的IntStream,然后使用sum方法计算总和:
importjava.util.Arrays;importjava.util.List;importjava.util.stream.Collectors;publicclassMain{publicstaticvoidmain(String[]args){List<Person>people=Arrays.asList(newPerson("Alice",30),newPerson("Bob",25),newPerson("Charlie",35));inttotalAge=people.stream().mapToInt(Person::getAge)// 将Person对象转换为int流,提取年龄字段.sum();// 计算总和System.out.println("Total age: "+totalAge);// 输出Total age: 90}}importjava.util.List;importjava.util.ArrayList;// 假设对象类为 User,字段为 age (String)classUser{privateStringage;publicUser(Stringage){this.age=age;}publicStringgetAge(){returnage;}}publicclassMain{publicstaticvoidmain(String[]args){List<User>userList=newArrayList<>();userList.add(newUser("10"));userList.add(newUser("20"));userList.add(newUser("30"));// 方案:过滤非空且合法数字,转换后求和intsum=userList.stream().filter(u->u.getAge()!=null&&!u.getAge().isEmpty())// 防止空指针.mapToInt(u->{try{returnInteger.parseInt(u.getAge());}catch(NumberFormatExceptione){return0;// 非法数字视为0,或根据业务抛出异常}}).sum();System.out.println(sum);// 输出: 60}}方法2:使用reduce方法
你也可以使用reduce方法来累加某个字段的值:
inttotalAge=people.stream().map(Person::getAge)// 将Person对象映射为年龄值.reduce(0,Integer::sum);// 使用reduce方法累加年龄值,初始值为0System.out.println("Total age: "+totalAge);// 输出Total age: 90方法3:使用collect和summingInt(Java 8或更高版本)
inttotalAge=people.stream().collect(Collectors.summingInt(Person::getAge));// 使用Collectors.summingInt收集器计算总和System.out.println("Total age: "+totalAge);// 输出Total age: 90以上方法都可以用来计算一个列表中所有对象的某个字段的累计和。选择哪种方法取决于你的具体需求和偏好。通常,使用mapToInt().sum()或collect(Collectors.summingInt())是最直接和高效的方式