JAVA中对list使用stream对某个字段求和

本文详细介绍如何使用Java Stream API对整型列表进行求和、计算平均数、获取元素个数、最大值及最小值。同时,演示了对对象列表中特定数值字段的求和操作,包括两种实现方式,以及如何对对象列表中的BigDecimal类型字段进行汇总。
该文章已生成可运行项目,
//1.对int类型list进行求和
Integer[] integerArray = {1, 3, 5, 10, 18};

List<Integer> list = new ArrayList<>(Arrays.asList(integerArray));

IntSummaryStatistics summaryStatistics = list.stream().mapToInt((s) -> s).summaryStatistics();
System.out.println("总和:" + summaryStatistics.getSum());
System.out.println("平均数:" + summaryStatistics.getAverage());
System.out.println("总个数:" + summaryStatistics.getCount());
System.out.println("最大值:" + summaryStatistics.getMax());
System.out.println("最小值:" + summaryStatistics.getMin());



//2.对list中的对象某个数值字段求和
List<User> userList = new ArrayList<>();
User user1 = new User();
user1.setAge(10);
userList.add(user1);
User user2 = new User();
user2.setAge(20);
userList.add(user2);
//写法1
int ageSum = userList.stream().collect(Collectors.summingInt(User::getAge));
System.out.println("年龄总和 :" + ageSum);
//写法2
int ageSumTwo = userList.stream().mapToInt(User::getAge).sum();
System.out.println("年龄总和2: " + ageSumTwo);


//3.对list中对象某个BigDecimal字段求和
 List<Lpn> lpnList = service.selectInvGroupBId(containerId());
 BigDecimal totalSku = 
             lpnList.stream().map(Lpn::getQty).reduce(BigDecimal.ZERO,BigDecimal::add);

 

本文章已经生成可运行项目
### 使用 Java Stream 对特定字段进行求和操作 在 Java 中,可以使用 `Stream` API 来对集合中的对象的某个字段进行求和操作。以下是实现这一功能的完整方法: 假设有一个包含多个对象的列表,每个对象都有一个名为 `value` 的字段,目标是对这些对象的 `value` 字段进行求和。 #### 示例代码 ```java import java.util.Arrays; import java.util.List; class Item { private int value; public Item(int value) { this.value = value; } public int getValue() { return value; } } public class Main { public static void main(String[] args) { List<Item> items = Arrays.asList(new Item(10), new Item(20), new Item(30)); int sum = items.stream() .mapToInt(Item::getValue) .sum(); System.out.println("Sum of values: " + sum); } } ``` #### 代码解析 - `items.stream()`:将列表转换为流,以便使用流式操作[^1]。 - `mapToInt(Item::getValue)`:将流中的每个 `Item` 对象映射为其 `value` 字段的值,结果是一个 `IntStream`。 - `sum()`:计算 `IntStream` 中所有元素的总和。 #### 注意事项 如果字段类型不是基本数据类型(如 `Integer` 而不是 `int`),则需要使用 `mapToLong` 或 `mapToDouble` 方法来处理其他数值类型[^1]。 例如: ```java double sum = items.stream() .mapToDouble(Item::getValueAsDouble) .sum(); ``` 这里假设 `getValueAsDouble` 返回的是 `double` 类型的值。 --- ### 处理复杂场景 当需要对嵌套结构或更复杂的对象进行求和时,可以结合 `Optional` 和 `filter` 来避免空值问题。 #### 示例代码 ```java import java.util.Optional; class Order { private Optional<Integer> amount; public Order(Integer amount) { this.amount = Optional.ofNullable(amount); } public Optional<Integer> getAmount() { return amount; } } public class Main { public static void main(String[] args) { List<Order> orders = Arrays.asList(new Order(100), new Order(null), new Order(200)); int total = orders.stream() .flatMap(order -> order.getAmount().stream()) .mapToInt(Integer::intValue) .sum(); System.out.println("Total amount: " + total); } } ``` #### 代码解析 - `flatMap(order -> order.getAmount().stream())`:将 `Optional<Integer>` 转换为流,并过滤掉空值。 - `mapToInt(Integer::intValue)`:将 `Integer` 转换为原始类型 `int`。 - `sum()`:计算总和。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值