List strem sum

文章展示了如何使用Java8的StreamAPI来处理数据。intageSum是通过stream().collect()方法计算User对象集合中所有用户的年龄总和,而paymentPrice则是通过stream().map()和reduce()方法求得分布订单的金钱总额。

最近一直用到,特此记录一下

int ageSum = distributionOrders.stream().collect(Collectors.summingInt(User::getAge));



BigDecimal paymentPrice = distributionOrders.stream().map(User::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);

Java中,使用Stream API对`List`进行分组操作是一种常见且高效的方式。Java 8引入的`Collectors.groupingBy`方法可以轻松实现基于某个字段或条件的分组操作。以下是对`List`进行分组的几种常见方法。 ### 1. 基于对象的某个字段进行分组 假设有一个`User`类,其中包含一个`name`字段,可以通过该字段进行分组。 ```java import java.util.*; import java.util.stream.Collectors; class User { private String name; private int age; // 构造方法、getter和setter } public class GroupingExample { public static void main(String[] args) { List<User> users = Arrays.asList( new User("Alice", 30), new User("Bob", 25), new User("Alice", 22), new User("Bob", 35) ); Map<String, List<User>> groupedByUser = users.stream() .collect(Collectors.groupingBy(User::getName)); groupedByUser.forEach((name, userList) -> { System.out.println("Name: " + name); userList.forEach(user -> System.out.println(" " + user.getAge())); }); } } ``` ### 2. 基于条件进行分组 除了基于字段进行分组,还可以根据某些条件进行分组。例如,根据某个字段是否满足特定条件进行分组。 ```java Map<Boolean, List<User>> groupedByCondition = users.stream() .collect(Collectors.groupingBy(user -> user.getName().startsWith("A"))); groupedByCondition.forEach((isA, userList) -> { System.out.println(isA ? "以A开头的名字" : "非A开头的名字"); userList.forEach(user -> System.out.println(" " + user.getName())); }); ``` ### 3. 分组后执行操作 在分组完成后,可以对每个分组执行特定的操作。例如,根据分组结果打印不同的信息[^1]。 ```java groupedByCondition.forEach((isA, userList) -> { if (isA) { userList.forEach(user -> System.out.println("精英用户: " + user.getName())); } else { userList.forEach(user -> System.out.println("普通用户: " + user.getName())); } }); ``` ### 4. 自定义数据结构的分组 如果需要将分组后的结果转换为自定义的数据结构,可以在分组时使用`map`操作进行转换[^2]。 ```java List<GroupedUser> customGrouped = users.stream() .collect(Collectors.groupingBy(User::getName, Collectors.toList())) .entrySet().stream() .map(entry -> new GroupedUser(entry.getKey(), entry.getValue())) .collect(Collectors.toList()); ``` ### 5. 多级分组 除了单级分组,还可以实现多级分组。例如,先按`name`分组,再按`age`分组。 ```java Map<String, Map<Integer, List<User>>> multiLevelGrouping = users.stream() .collect(Collectors.groupingBy(User::getName, Collectors.groupingBy(User::getAge))); ``` ### 6. 分组并进行聚合操作 除了简单的分组,还可以结合`Collectors.summingInt`、`Collectors.averagingInt`等方法进行聚合操作。 ```java Map<String, Integer> totalAgePerName = users.stream() .collect(Collectors.groupingBy(User::getName, Collectors.summingInt(User::getAge))); ``` ### 7. 分组并合并对象 在某些情况下,可能需要将分组后的对象进行合并。例如,将多个对象合并为一个对象,并将某些字段拼接起来[^3]。 ```java List<AucBidResourcePrice> newList = new ArrayList<>(); groupedList.parallelStream() .collect(Collectors.groupingBy(AucBidResourcePrice::getPartyId, Collectors.toList())) .forEach((id, groupList) -> { groupList.stream().reduce((a, b) -> new AucBidResourcePrice() .setBidResourcePriceId(null) .setAuctionBatchId(a.getAuctionBatchId()) .setPartyId(a.getPartyId()) .setIsDeleteFlag(a.getIsDeleteFlag()) .setPriceFlagIds(a.getPriceFlagIds().append("," + b.getBidResourcePriceId())) ).ifPresent(newList::add); }); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值