20220915 Java Stream流和Optional

Stream流

  • Stream API ( java.util.stream) 把函数式编程风格引入到Java中。这是目前为止对Java类库最好的补充,因为Stream API可以极大提供Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
  • Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

Stream定义

是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。“集合讲的是数据,Stream讲的是计算!”

注意:

  1. Stream 自己不会存储元素。
  2. Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
  3. Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行

Stream的创建

public class TestStream {
    public static void main(String[] args) {

        //1 通过Collection接口的子类对象的方法
        List<String> list = Arrays.asList("a","b","c","d","e");
        Stream<String> stream = list.stream();

        //2 通过Arrays的stream方法得到流
        String [] arr = {"a","b","c","d","e"};
        Stream<String> stream1 = Arrays.stream(arr);

        //3 通过Stream接口的静态方法
        Stream<String> abc = Stream.of("abc", "xyz");
    }
}

Stream的一些方法

Person类

public class Person {
    private int id;
    private String name;
    private int age;


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return id == person.id &&
                age == person.age &&
                Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, age);
    }

    public Person() {
    }

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

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    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;
    }
}

常用方法

public class TestStream2 {
    public static void main(String[] args) {

        Person p1 = new Person(1,"a",20);
        Person p2 = new Person(2,"b",21);
        Person p3 = new Person(1,"a",20);
        Person p4 = new Person(4,"d",19);
        Person p5 = new Person(5,"e",18);
        Person p6 = new Person(6,"f",17);
        Person p7 = new Person(7,"g",25);
        //1 通过Stream接口的静态方法
        Stream<Person> stream = Stream.of(p1,p2,p3,p4,p5,p6,p7);

        //遍历forEach输出
        System.out.println("*********stream.forEach 遍历输出************");
        stream.forEach(System.out::println);


        System.out.println("*********stream.distinct去重,要重写perosn的equas和hashcode方法************");
        stream.distinct().forEach(System.out::println);

        System.out.println("*********stream.sorted 排序************");
        stream.sorted(Comparator.comparing(Person::getAge)).forEach(System.out::println);

        System.out.println("*********stream.filter过滤************");
        stream.sorted(Comparator.comparing(Person::getAge)).filter((p)->p.getAge()>20).forEach(System.out::println);


        System.out.println("*********stream.limit截断************");
        stream.sorted(Comparator.comparing(Person::getAge)).filter((p)->p.getAge()>20).limit(1).forEach(System.out::println);

        //统计计算的方法
        //最大值 最小值 求和 平均值

        IntSummaryStatistics intSummaryStatistics = stream.mapToInt(p -> p.getAge()).summaryStatistics();
//        //输出看看
        //IntSummaryStatistics{count=7, sum=140, min=17, average=20.000000, max=25}
        System.out.println(intSummaryStatistics);
        System.out.println(intSummaryStatistics.getCount());
        System.out.println(intSummaryStatistics.getSum());
        System.out.println(intSummaryStatistics.getMin());
        System.out.println(intSummaryStatistics.getAverage());
        System.out.println(intSummaryStatistics.getMax());


        Optional<Person> first = stream.findFirst();
//        //拿到的一个Optional对象
        System.out.println(first);

        System.out.println(first instanceof  Optional);

//        //拿到person
        System.out.println(first.get());


        //筛选 ,字母转换功能
        List<String> collect = stream.map(p -> p.getName().toUpperCase()).collect(Collectors.toList());
        System.out.println(collect);
    }
}

Optional类

  • Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

  • Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

  • Optional 类的引入很好的解决空指针异常。

  • Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。

Optional的常用方法

  • Optional.empty() : 创建一个空的 Optional 实例
  • Optional.of(T t) : 创建一个 Optional 实例
  • Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
  • isPresent() : 判断是否包含值
  • T get(): 如果调用对象包含值,返回该值,否则抛异常
  • orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
  • orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
  • map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
  • flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值