Stream流式编程

Stream:就是数据渠道,用于操作数据源(集合、数组)所产生的元素序列。“集合讲的是数据,流讲的是计算。”是JDK1.8的新特性。

注意:

1.Stream 自己不会存储元素。

2.Stream 不会改变源对象。相反,他们会返回一个持有结果的新的Stream。

3.Stream 操作时延迟执行的。这意味着他们会等到需要的结果的时候才会执行。

Stream操作的三个步骤

1.创建Stream

一个数据源(如:集合、数组),获取一个流

2.中间操作

一个中间操作链,对数据源的数据进行处理

3.终止操作(终端操作)

一个终止操作,执行中间操作链,并产生结果。

Stream流常用的API:

filter:过滤   map:映射,举例:将一个对象集合 映射 只获取ID集合     sorted:排序       sum:求和,求最大值,最小值等一些聚合操作的函数       groupingBy:分组    limit:截取,可以实现分页效果      distinct:去重

当然在使用toMap()函数之后,返回的就是一个Map了,自然会需要key和value。toMap()的第一个参数就是用来生成key值的,第二个参数就是用来生成value值的。第三个参数用在key值冲突的情况下:如果新元素产生的key在Map中已经出现过了,第三个参数就会定义解决的办法。

 

下面是我自己写的一个小demo,实体类可以下载个lombok这个插件,通过注解@Data来完成get,set的构建。

1、创建一个User的实体类

public class User {
     private String name;
    private   int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public User() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

2、写一个main方法

package org.example;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        ArrayList<User> objects = new ArrayList<>();
        objects.add(new User("张三",21));
        objects.add(new User("张三1",31));
        objects.add(new User("张三2",41));
        objects.add(new User("张三3",11));
        objects.add(new User("张三4",21));
//         System.out.println(objects);
//         stream流的使用

        System.out.println("循环输出===============================");
//        1、循环输出   foreach
        objects.stream().forEach(lx->{
            System.out.println(lx);
        });
        /**
         * User{name='张三', age=21}
         * User{name='张三1', age=31}
         * User{name='张三2', age=41}
         * User{name='张三3', age=11}
         * User{name='张三4', age=21}
         */


        System.out.println("过滤个数===============================");
//        2、过滤  filter
        long count = objects.stream().filter(l -> 0!= l.getAge()).count();
        System.out.println("年龄不等于0的个数:"+count);
        /**
         * 年龄不等于0的个数:5
         */

        List<User> collect = objects.stream().filter(l -> l.getAge() > 21).collect(Collectors.toList());
        System.out.println("年龄大于21的:"+collect);
        /**
         * 年龄大于21的:[User{name='张三1', age=31}, User{name='张三2', age=41}]
         */

        List<User> collect1 = objects.stream().filter(l -> l.getAge()!=0).collect(Collectors.toList());
        System.out.println("成绩不为0的:"+collect1);
        /**
         * 成绩不为0的:[User{name='张三', age=21}, User{name='张三1', age=31}, User{name='张三2', age=41}, User{name='张三3', age=11}, User{name='张三4', age=21}]
         */

        List<User> collect2= objects.stream().filter(l -> l.getAge() !=0).sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());
        System.out.println("按照最高排序:"+collect2);
        /**
         * 按照最高排序:[User{name='张三2', age=41}, User{name='张三1', age=31}, User{name='张三', age=21}, User{name='张三4', age=21}, User{name='张三3', age=11}]
         */

//        3、map集合映射
        System.out.println("map集合映射===============================");
        String collect3 = objects.stream().map(l -> l.getName()).collect(Collectors.joining("、"));
        System.out.println("所有名字以拼接字符串的方式连接在一起(顿号分割):"+collect3);
        /**
         * 所有名字以拼接字符串的方式连接在一起(顿号分割):张三、张三1、张三2、张三3、张三4
         */

        Map<Integer, List<User>> collect4 = objects.stream().filter(l -> l.getAge() != 0).collect(Collectors.groupingBy(User::getAge));
        System.out.println("按照年龄进行归类:"+collect4);
        /**
         * 按照年龄进行归类:
         * {21=[User{name='张三', age=21}, User{name='张三4', age=21}],
         * 41=[User{name='张三2', age=41}],
         * 11=[User{name='张三3', age=11}],
         * 31=[User{name='张三1', age=31}]}
         */

//      遍历map,取出内容
        for(Map.Entry<Integer,List<User>> listMap:collect4.entrySet()){
            System.out.println("年龄为:"+listMap.getKey()+"的数量"+listMap.getValue().size()+"人----"+listMap.getValue());
        }
        /**
         * 年龄为:21的数量2人----[User{name='张三', age=21}, User{name='张三4', age=21}]
         * 年龄为:41的数量1人----[User{name='张三2', age=41}]
         * 年龄为:11的数量1人----[User{name='张三3', age=11}]
         * 年龄为:31的数量1人----[User{name='张三1', age=31}]
         */

        System.out.println("Statistics进行统计===============================");
//      3、Statistics进行统计
        IntSummaryStatistics intSummaryStatistics = objects.stream().mapToInt(l -> l.getAge()).summaryStatistics();
        System.out.println("年龄最大的:"+intSummaryStatistics.getMax());
        System.out.println("年龄最小的:"+intSummaryStatistics.getMin());
        /**
         * 年龄最大的:41
         * 年龄最小的:11
         */
    }



}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值