Java 8新特性Stream API与Collectors:探索List集合的高效转换与聚合

背景

在Java 8中,Stream API的引入极大地提升了对集合数据处理的灵活性和效率,而Collectors类更是为数据的收集和聚合提供了强大的工具。本文将深入探讨如何利用List集合.stream().collect()这一链式调用,实现集合数据的高效转换与聚合,为你的编程之旅增添一抹亮色。

引言

Java 8以前,我们处理集合数据时,往往需要通过循环遍历、手动创建新的集合来实现转换和聚合操作,这种方式不仅代码冗长,而且难以阅读和维护。随着Stream API的出现,一切变得简洁而高效。stream()方法将集合转换为Stream流,而collect()方法则用于将流中的数据按照指定规则收集到一个新的容器中,或者聚合为一个值,如计数、求和等。

基础概念

•Stream:一个支持链式操作的元素序列,可以对集合数据进行操作,如过滤、排序、映射等,而无需显式迭代。

•Collectors:一个工具类,提供了多个静态方法,帮助我们将流转换为另一种数据结构,或者执行聚合操作。

使用场景

 1.数据转换

假设我们有一个List<String>,里面存储了一组用户名称,现在我们需要将所有用户名转换为大写并收集到一个新的列表中。List<String> names = Arrays.asList("张三", "李四", "王五","小李子");
List<String> uppercaseNames = names.stream().map(String::toUpperCase).collect(Collectors.toList());

2.数据聚合

如果我们需要统计这些用户名中长度大于5的名字有多少个,可以这样做:

long count = names.stream().filter(name -> name.length() > 5).collect(Collectors.counting());

3.分组

对于复杂的数据处理,比如需要按用户名首字母分组,可以使用groupingBy:

Map<Character, List<String>> groupedNames = names.stream().collect(Collectors.groupingBy(name -> name.charAt(0)));

4.归约

如果需要将所有用户名合并为一个字符串,每两个用户名之间用逗号分隔,可以使用joining:String concatenatedNames = names.stream().collect(Collectors.joining(", "));

进阶技巧

1.多级收集

可以结合使用多个收集器,例如,先分组后统计每组的数量。

Map<Character, Long> groupAndCount = names.stream().collect(Collectors.groupingBy(name -> name.charAt(0),Collectors.counting()));


2.分区

使用partitioningBy可以根据条件将数据分为两部分。

Map<Boolean, List<String>> partitionedNames = names.stream().collect(Collectors.partitioningBy(name -> name.length() > 5));

3.键值对

使用Collectors.toMap可以得到键值对的数据结构

Map<String, MerchantOrderInfo> map = list.stream().collect(Collectors.toMap(MerchantOrderInfo::getOrderNumber, Function.identity(),(existing, relacement)->existing));

4.高级键值对,值为集合

Map<String, List<MerchantOrderInfo>> map= list.stream().collect(Collectors.groupingBy(MerchantOrderInfo::getOrderNumber, Collectors.toList()));

结尾:

个人经验总结,不喜勿喷,大家多多交流!

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
要在Java 8 Stream中进行分组后再聚合求总数,可以使用`Collectors.groupingBy()`方法进行分组操作,然后使用`Collectors.summingInt()`方法进行聚合求和操作。 下面是一个示例代码: ```java import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Person> persons = Arrays.asList( new Person("John", 25), new Person("Jane", 30), new Person("Bob", 20), new Person("Alice", 35), new Person("John", 40) ); Map<String, Integer> totalAgeByPerson = persons.stream() .collect(Collectors.groupingBy(Person::getName, Collectors.summingInt(Person::getAge))); System.out.println("Total age by person: " + totalAgeByPerson); } static class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } } ``` 在上述示例中,我们有一个`Person`类,其中包含姓名和年龄字段。我们创建了一个包含几个`Person`对象的列表。通过使用`stream()`方法获取列表的流,然后使用`Collectors.groupingBy()`方法按姓名字段进行分组,并使用`Collectors.summingInt()`方法对每个分组中的年龄字段进行求和。最终,我们得到了一个`Map`,其中键是姓名,值是年龄字段的总和。输出结果为: ``` Total age by person: {Alice=35, Bob=20, John=65, Jane=30} ``` 请注意将代码中的`Person`类替换为您实际使用的类,并相应地更改`groupingBy()`方法和`summingInt()`方法中的字段引用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java后端程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值