jdk 8 新特性 优化版

本文详细介绍了Java的StreamAPI,包括其特点、构成、创建源、中间操作和终止操作。此外,还讨论了Lambda表达式的使用,如过滤、映射和函数式接口。同时,展示了如何通过StreamAPI简化代码,提高效率,并提供了多个示例来说明其工作原理。
摘要由CSDN通过智能技术生成

此博客所有只是作为个人笔记,个人的知识的总结。如有不对的地方欢迎指出,谢谢。会不断完善笔记的,会发布第一稿然后再后续完善。

stream介绍

stream 是一组用来处理数组和集合的API
目的 简洁代码 较少for循环看起来更舒服 多核友好

特性

1 不是数据结构没有内部存储
2 不支持索引访问
3 惰性化(延迟计算)
4 支持并行
5对于数组和集合有很好的支持性
6支持多种功能 如查找 汇总 过滤等

Stream 构成

组成 源 中间操作 终止操作
源 一定是集合
对于流来说 中间操作可以有多个但是必定有一个返回结果
终止操作一个流只有一个
Stream只有遇见终止操作才会进行遍历

创建源

代码如下


    public static void main(String[] args) {
        //1 通过数组来生产一个stream对象
        String[] strings = {"c", "s", "a", "b"};
        // static <T> Stream<T> of(T... values)
        //返回一个元素为指定值的顺序排列的流。
        Stream<String> stringStream = Stream.of(strings);
        stringStream.forEach(System.out::println);

        //2 通过集合生成
        List<String> list = Arrays.asList("a", "b", "c", "d");
        Stream<String> listStream = list.stream();
        listStream.forEach(System.out::println);

        // 3 static <T> Stream<T> generate(Supplier<T> s)
        //返回一个无穷序列无序流,其中每个元素是由提供 Supplier生成。
        //因为是无限的 所以需要东西进行限制 limit方法进行限制
        Stream<List> generateStream = Stream.generate(() -> Arrays.asList("我", "是", "帅", "哥"));
        generateStream.limit(1).forEach(System.out::println);

        //4 iterator iterate(T seed, UnaryOperator<T> f)
        //返回一个无穷序列有序 Stream由最初的一元 seed函数的 f迭代应用产生的,产生一个由 seed, f(seed), f(f(seed)) Stream,等。
        //第一单元(位置0)在Stream将提供seed。对于n > 0,位置n元素,将在位置n - 1元素的应用功能f结果。
        //也就是说第一个是起始值 第二个是UnaryOperator类型的 UnaryOperator是表示一个操作在一个操作数,它产生一个与它的操作数相同的结果的结
        Stream<String> integerStream = Stream.iterate("帅",x->x+"1" );
        integerStream.limit(5).forEach(System.out::println);
        // 5 强转或者说是 相同父类的流的转
        String stream="abcd";
        IntStream intStream=stream.chars();
        intStream.forEach(System.out::println);
    }
中间操作

代码如下

    public static void main(String[] args) {
        //中间操作 其实就是给与流进行一些列筛选 汇总 排序之类的操作的方法
        // 第一个进行过滤的操作的方法 Stream<T> filter(Predicate<? super T> predicate);
        Arrays.asList(1, 2, 4, 5).stream().filter((x) -> x > 4).forEach(System.out::println);
        // 如果是stream对象是返回值的话 则是中间操作
    }
终止操作
 public static void main(String[] args) {
        //终止操作,其实就是结束操作 比如foreach 或者count 这类会返回结果的操作 如果没有终止操作则不会产生执行的结果(也就是不会去执行)
        //比如max 就有返回值Optional
        Optional<Integer> optional = Arrays.asList(1, 2, 4, 5).stream().max((a, b) -> a - b);
        int maxNumber = Arrays.asList(1, 2, 4, 5).stream().max((a, b) -> a - b).get();
        System.out.println(maxNumber);
        //有些方法没有 比如总和之类的,可以先查接口进行转到intStream 在其中找到相对于的方法
    }
API文档中的具体方法

以下为api中stream的方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二。lambda 表达式

标准格式由三个部分组成。
(参数类型 参数名称)->{}
参数列表 箭头 方法体

FunctionalInterface 被该注解修饰的接口只能一个抽象的方法

lambad 表达式在运行的时候 会新增一个方法 这个方法就是方法体中的方法 还会形成一个匿名内部类 实现接口,重写抽象方法,在重写的方法中调用新的生产的方法

省略写法 1 小括号内的参数类型 可以省略。2 如果只有小括号里只有一个参数 则括号可以省略 3。如果方法体里就一条语句 那么大括号可以省略 return 可以省略

lambda 表达式和匿名内部类的不一样
1 抽象方法的数量不一样。 lambda 只能由一个
2 实现方法不一样 匿名是编译后生成。lambda 是运行的时候生成一个累
3 所需类型不一样。lambda 必须是接口

三 接口中新增 默认方法+静态方法
现在是可以支持 静态方法 默认方法。静态常量 抽象方法
默认方法
因为对新增的抽象方法 所有的接口都要进行实现 这样子不利于开发
并且实现类可以调用接口的默认方法 或者支持重写

静态方法
为了接口的扩展
静态方法 不会被实现类调用 和重写 ,调用的话只能通过接口来调用的

四 函数式的接口
已有的 提供的接口
1 supplier 无参有返回值的接口
2 consumer 有参无返回值的
3 function 有参数也有返回的
4 predicate 有参数 返回为boolean 的

五 方法引用
::
当lambda 的使用内容 或者需要的逻辑有了,可以用这个来进行引用 是一种替换方案
对象::方法名
类名::静态方法/普通方法
类名/数组:: new。构造器。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值