Java8Stream最佳实践

什么是Java8 Stream流?

Java8 Stream流是一个在集合或数组上执行数据处理操作的API。它提供了一种更简洁、更具可读性的方式来编写高效的数据处理代码。Stream流支持串行和并行两种模式,让我们轻松地利用多核处理器的优势来处理大量的数据。

初始化数据

@Data
public class Person {
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 名称
     */
    private String name;

    /**
     * 城市
     */
    private String city;
}
List<String> nameList = Stream.of("彬蔚", "彬彬", "博裕", "博闻", "瑜昕", "槿玥", "妙桐", "莹然", "夕纯", "思羽", "溪瑶", "羽慕","瑾语","娴静", "焓艳","涵芯" , "语程","茹馨","雅舒","芹柔","寒凝")
                .collect(Collectors.toList());
        List<String> cityList = Stream.of("北京", "上海", "广州", "深圳")
            .collect(Collectors.toList());
        for (int i = 0; i < 20; i++) {
            Person person = new Person();
            person.setAge(i*3);
            person.setName(nameList.get(i));
            person.setCity(cityList.get(ThreadLocalRandom.current().nextInt(cityList.size())));
            personList.add(person);
        }

Stream流常见操作

过滤操作

过滤操作可以从集合中选择所需的元素。例如,我们可以使用filter()方法筛选出大于等于40岁的人:

		List<Person> filteredPersons = personList.stream()
                .filter(p -> p.getAge() >= 40)
                .collect(Collectors.toList());
		System.out.println(filteredPersons);
//输出
//[Person(age=42, name=焓艳, city=上海), Person(age=45, name=涵芯, city=广州), Person(age=48, name=语程, city=深圳), Person(age=51, name=茹馨, city=深圳), Person(age=54, name=雅舒, city=北京), Person(age=57, name=芹柔, city=上海)]

映射操作

映射操作可以将一个元素列表转换成另一个元素列表。例如,我们可以使用map()方法将字符串列表转换为它们的长度列表:

		List<String> strings = Stream.of("北京市", "四川成都", "高新", "京").collect(Collectors.toList());
        List<Integer> lengths = strings.stream()
                .map(String::length)
                .collect(Collectors.toList());
		System.out.println(lengths);
//输出
//[3, 4, 2, 1]

排序操作

排序操作可以按照指定的顺序对元素进行排序。例如,我们可以使用sorted()方法按年龄对人进行排序:默认升序

		List<Person> sortedPersons = personList.stream()
                .sorted(Comparator.comparing(Person::getAge))
                .collect(Collectors.toList());
		System.out.println(sortedPersons);
//输出
//[Person(age=0, name=彬蔚, city=深圳), Person(age=3, name=彬彬, city=深圳), Person(age=6, name=博裕, city=深圳), Person(age=9, name=博闻, city=北京), Person(age=12, name=瑜昕, city=上海), Person(age=15, name=槿玥, city=广州)...]

归约操作

归约操作可以将元素列表转换为单个值。例如,我们可以使用reduce()方法将数字列表中的所有数字相加:

		List<Integer> numbers = Stream.of(1,5,7,9).collect(Collectors.toList());
        int sum = numbers.stream()
                .reduce(0, Integer::sum);
        System.out.println(sum);
//输出
//22

收集操作

收集操作可以将结果收集到一个集合中。例如,我们可以使用collect()方法将人列表分组并按城市进行分组:

        Map<String, List<Person>> personsByCity = personList.stream()
                .collect(Collectors.groupingBy(Person::getCity));
        System.out.println(personsByCity);
//输出
//{上海=[Person(age=6, name=博裕, city=上海), Person(age=9, name=博闻, city=上海), Person(age=12, name=瑜昕, city=上海), Person(age=15, name=槿玥, city=上海), Person(age=18, name=妙桐, city=上海), Person(age=27, name=思羽, city=上海), Person(age=30, name=溪瑶, city=上海), Person(age=42, name=焓艳, city=上海), Person(age=51, name=茹馨, city=上海), Person(age=57, name=芹柔, city=上海)], 广州=[Person(age=0, name=彬蔚, city=广州), Person(age=21, name=莹然, city=广州), Person(age=33, name=羽慕, city=广州)], 北京=[Person(age=36, name=瑾语, city=北京), Person(age=39, name=娴静, city=北京), Person(age=54, name=雅舒, city=北京)], 深圳=[Person(age=3, name=彬彬, city=深圳), Person(age=24, name=夕纯, city=深圳), Person(age=45, name=涵芯, city=深圳), Person(age=48, name=语程, city=深圳)]}
 

Stream流并行处理

Java8 Stream流可以通过parallelStream()方法启用并行处理,使我们能够轻松地利用多核处理器的优势,并快速处理大量数据。例如,对于非常大的数字列表,我们可以使用parallelStream()方法将其分成几个部分并并行处理它们:

List<Integer> numbers = Stream.of(4545,45,131,44,643,13,458,41,46,45,13146,131,4,31,34,4,1348,45,46).collect(Collectors.toList());
        int sum = numbers.parallelStream()
                .reduce(0, Integer::sum);
        System.out.println(sum);
//输出
//20800

总结

Java8 Stream流提供了一种更加简洁和易于理解的方式来编写高效的数据处理代码。Stream流支持串行和并行两种模式,让我们可以轻松地利用多核处理器的优势来处理大量的数据。希望本文能够帮助你更好地了解Java8 Stream流及其应用。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

包耳邹

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

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

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

打赏作者

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

抵扣说明:

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

余额充值