Java Stream流讲解及用法

 一、Java Stream流概述

在Java 8中,得益于 Lambda 所带来的函数式编程, 引入了一个全新的 Stream 流概念。Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找/筛选/过滤、排序、聚合和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

目的:用于简化集合和数组操作的API。

二、Stream的用法

Stream流的常用方法

字符流过滤、收集方法

 List<String> strList = Arrays.asList("green", "red", "blue", "black", "yellow");
        //过滤
        List<String> collect = strList.stream()
                .filter(s -> s.equals("green") || s.equals("red"))
                .collect(Collectors.toList());
        System.out.println(collect);
        //控制台输出: [green, red]

对象类型过滤

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private String name;
    private Integer age;
    private String address;

}

以下代码会涉及filter、collect、max、min、map等的用法 

    @Test
    public void test2() {
        //对象类型过滤
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("张三",10,"shanghai"));
        personList.add(new Person("李四",22,"beijing"));
        personList.add(new Person("王五",34,"guangzhou"));
        personList.add(new Person("武大郎",55,"tianjin"));
        personList.add(new Person("欧阳司马",55,"guangzhou"));

        //获取30岁以上及居住在guangzhou的人
        List<Person> collect = personList.stream()
                .filter(person -> person.getAge() > 30)
                .collect(Collectors.toList());
        System.out.println(collect);
        /*
        控制台输出: [Person(name=王五, age=34, address=guangzhou), 
        Person(name=欧阳司马, age=55, address=guangzhou)]
         */

        //筛选出年纪最大的人
        Optional<Person> max = personList.stream()
                .max(Comparator.comparing(Person::getAge));
        System.out.println(max.get());
        //控制台输出:Person(name=武大郎, age=55, address=tianjin)
        
        //筛选出年纪最小的人
        Optional<Person> min = personList.stream()
                .min(Comparator.comparing(Person::getAge));
        System.out.println(min.get());
        //控制台输出:Person(name=张三, age=10, address=shanghai)

        //同时计算长度、最大值、最小值、平均值
        IntSummaryStatistics intCollect = personList.stream()
                .collect(Collectors.summarizingInt(Person::getAge));
        System.out.println(intCollect);
        //控制台输出:IntSummaryStatistics{count=5, sum=176, min=10, average=35.200000,                     
        max=55}
        //求年纪的和
        System.out.println(intCollect.getSum());
        //控制台输出: 176

        //求年纪的和还可以这样来实现
        Optional<Integer> reduce = personList.stream()
                .map(person -> person.getAge()).reduce(Integer::sum);
        System.out.println(reduce.get());
        //控制台输出: 176
    }

以下代码承接以上,涉及toList、toMap、toSet等的用法 

        //toList的用法,把年纪组成一个集合里面
        List<Integer> integers = personList.stream()
                .map(person -> person.getAge()).collect(Collectors.toList());
        System.out.println(integers);

        //以名字为key,年龄为value组合一个Map集合
        Map<String, Integer> integerMap = personList.stream()
                .collect(Collectors.toMap(Person::getName, Person::getAge));
        System.out.println(integerMap);
        //输出: {李四=22, 张三=10, 武大郎=55, 欧阳司马=55, 王五=34}

        //toSet,把年纪组成一个set集合里面
        Set<Integer> integerSet = personList.stream()
                .map(person -> person.getAge()).collect(Collectors.toSet());
        System.out.println(integerSet);
        //输出:[34, 22, 55, 10] 注意:因为set集合里面的数据不可重复,所以重复的数据只有1个

以上是Stream的常见用法,如果对您的学习和工作有所帮助,请关注一下本人的账号及点赞一下,谢谢!

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值