java零基础入门-java8新特性(下篇)

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

哈喽,各位小伙伴们好,我是喵手。

       今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流 学 习,互相学习,才能成长的更快,对吧。

       我是一名java开发,所以日常接触到最多的就是java啦,所以我趁自己有空,就来好好回忆,把自己学到的会的,进行输出,不图什么有回报,只想能帮助到更多的小伙伴,就好。

       小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对喵手我创作道路上最好的鼓励与支持!

一、概述

       论前几期啊,我们是分别讲了Object类Date类FormDate类Calendar类System类StringBuilder类,不知道大家掌握的如何,如果没有及时巩固的同学,可以看我这里,我给大家罗列了下,快速学习通道,只希望能帮助到大家更好的学习与成长,这就是我写作的初衷。

       ​上几期,我们是完整的学完了java异常类的学习及实战演示、以及学习了线程进程等基础概念,而这一期,我们要来玩点好的东西,那就是java8,我们都知道java8是自2004年发布java5之后最重要且一次重大的版本更新,虽然我们的JDK环境 也升级到了java1.8,但是在日常的开发过程中,使用最多的编程风格还是停留在 JDK1.7版本。

       那对于java1.8,你们有了解多少它相关的新特性呢?至于java8,于2013年9月正式发布,距离至今已快十年载了,想必大家对它的新特性大大小小也耳濡目染了些吧?那么趁着今天这个空闲日子,我就跟大家一起来聊聊它-java8之新特性。

二、本期教学目标

  • java8有哪些新特性
  • 什么是函数式接口
  • 什么是Lambda表达式
  • 掌握Stream Api
  • Stream和Collect集合区别
  • Stream创建方式
  • Stream操作三步骤

三、正文

1️⃣java8新特性

2️⃣什么是Lambda表达式

1️⃣可选类型声明

2️⃣可选的参数圆括号

3️⃣可选的大括号

4️⃣可选的返回关键字

       以上第1、2点内容,我是总结到了该篇《java零基础入门-java8新特性(上篇)》,需要的小伙伴可以去传送门直接去。​

3️⃣什么是函数式接口

       总而言之:函数式接口,即适用于函数式编程场景的接口。而Java中的函数式编程体现就是Lambda表达式,所以函数式接口就是可以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导。

4️⃣掌握Stream Api

       总而言之,何为Stream流,Stream是Java8中处理集合的关键抽象概念,它可以指定你对集合进行一些处理操作,比如对集合进行非常复杂的查找、过滤和映射数据等操作。

... ...

       以上第3、4点内容,我是总结到了该篇《java零基础入门-java8新特性(中篇)》。需要的小伙伴可以去传送门直接去。

5️⃣Stream和Collections区别

       说起Stream流,那肯定会想到Collections类,对比它两,你们知道,它两之间有何联系,又有何异同呢?这点,想必你们在上一期既然学了,那对于你们而言,肯定是要有所准备的啊。

       见名知意,既然称Stream为流,而Collections为集合工具类,那自然好区别,Stream流是一个集合元素的函数模型,而Collections是对元素集合进行的操作,而它本身也是一个集合,而Stream流不是集合,更不是数据结构,其本身也不存储任何元素,但它可以操作元素进行任何操作,是一种对元素的处理方案。

       且对于Stream流而言,Stream流属于管道流,只能被消费一次,比如第一次Stream流调用完,数据就会被处理后转到下一个Stream流上,而上一个Stream流就会关闭掉,不能再调用了。但是对于Collections,它不是,本身也是一个集合,即使是处理完了,也能还被接着调用。

我可以给大家举个例子:这样大家就好理解了:

        List<String> list = new ArrayList<>();

        //采用工具类往集合中一并添加元素
        Collections.addAll(list, "a", "b", "c", "d");

        list.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.charAt(0) - o1.charAt(0);
            }
        });
复制代码

       而对于Stream而言,它就是排序完后就结束了,转为下一个Stream。

    @Test
    public void testSort() {

        List<String> list = new ArrayList<>();

        //采用工具类往集合中一并添加元素
        Collections.addAll(list, "a", "b", "c", "d");

        Stream<String> sorted = list.stream().sorted();
    }
复制代码

       这样对比,你们就明白了吧。

6️⃣Stream创建方式

       上一期第四点也是讲述了其Stream流,而这一期,我们就要真正的来学习,到底如何使用它,毕竟学以致用就是这么来的,希望你们在学完后,也能对此有一定的启发与实战练习,能把它用上当前的项目上,毕竟用过后,还是很便捷的,对于其中有些api比起自己手动处理真的方便不少,而且执行效率也比你自己处理的快得多。

       说了这么多,可能大家都还不是很清楚Stream到底怎么创建,并且它有几种创建方式呢?这点你们大家有课余时间自行了解过吗?除了最直接的创建方式,就是直接对集合进行调用stream()方法即可,就是通过集合的方式,那除了这种方式还有其他的吗?

如下是我总结的四种创建Stream流的方法:

  • 通过集合创建Stream流。

比如:list.stream();

  • 通过数组创建Stream流。

比如:Arrays.stream(arr);

  • 通过Stream.of()方法Stream流。

比如:Stream.of("a","b");

  • 通过Stream.iterate(),创建无限流。

比如:Stream.iterate()

如下,我具体展开给大家讲解一下吧,具体如何创建,并且实测如何玩转Stream流。

第一种:通过集合创建Stream流。

代码演示如下:

    /**
     * 第一种:通过集合创建Stream流
     */
    @Test
    public void testCreateStream1() {

        //创建一个集合
        //存放全班同学姓名集合
        List<String> stus = new ArrayList<>();
        stus.add("马超");
        stus.add("李白");

        //使用Stream计数。
        long count = stus.stream().count();
    }
复制代码

第二种:通过数组创建Stream流。

代码演示如下:

    /**
     * 第二种:通过数组创建Stream流
     */
    @Test
    public void testCreateStream2() {

        //创建一个数组
        String[] arr = new String[10];
        long count = Arrays.stream(arr).count();
    }
复制代码

第三种:通过Stream.of()方法Stream流。

代码演示如下:

    /**
     * 第三种:通过Stream.of()方法Stream流
     */
    @Test
    public void testCreateStream3() {

        //定义一个数组。
        String[] arr = new String[10];
        long count = Stream.of(arr).count();
    }
复制代码

第四种:通过Stream.iterate(),创建无限流。

代码演示如下:

    /**
     * 第四种:通过Stream.iterate(),创建无限流。
     */
    @Test
    public void testCreateStream4() {
        Stream<Integer> stream = Stream.iterate(0, x -> x + 2).limit(10);
        long count = stream.count();

        System.out.println(count);
    }
复制代码

       如上我需要解释一下,代码啥意思,这是从x=0开始,然后获取0-10之间的偶数,然后再计数0-10之间共有多少个偶数。

...

       而对于具体打印,就是计数该集合或数组中的元素个数。比如对于示例1返回自然是2。因为总共就两个元素。

打印结果截图如下:

7️⃣Stream操作三步骤

       我们在上一节点,学完了对Stream流如何创建,及多种方式如何进行创建,对吧,那你们知道其Stream流的操作步骤不?因为直接用,肯定不会很太注意它是如何工作的。

如下是总结的Stream操作的三步骤,

  1. 创建Stream。
  2. 操作Stream。
  3. 终止操作。

       具体怎么理解呢?第一步:创建Stream,对于一个数据源(如集合、数组),先获取一个流。

       接着是操作Stream流,讲的是一个中间操作链,对数据源进行对应的操作,其中可以进行多次操作,每操作一次,就生成一个新的Stream。而最后一步,终止操作,就是执行中间链操作处理出结果。

具体我用代码给大家演示一下吧:

    @Test
    public void testOperaStream() {
        //创建一个集合
        //存放全班同学姓名集合
        List<String> stus = new ArrayList<>();
        stus.add("马超");
        stus.add("化马");
        stus.add("李白");
        stus.add("马儿");

        //筛选出带姓马的同学
        Stream<String> stream1 = stus.stream().filter(stu -> stu.startsWith("马"));
        //对姓马的同学进行排序
        Stream<String> stream2 = stream1.sorted();
        //打印排序后姓马的同学名字
        stream2.forEach(stu -> {
            System.out.println(stu);
        });
    }
复制代码

       先是通过一个集合来创建stream流,完了之后其中操作了其stream流,其中stream1、stream2就是在操作stream的中间过程,然后最后打印输出是终止操作。

如下是最终执行结果。

       所以对于stream流,并不是你们想象的那么难,只要你们能好好对其进行挖掘,并且学一下常用的那些api方法,其实就足够了。

... ...

       好啦,以上就是本期内容的全部教学内容啦,如果对文中的任何知识点有疑问,欢迎评论区评论留言呀,我看见都会一一解答的。

四、文末

       教学是结束了,但是有些话不知我但讲不当讲,啊哈哈, 可我还是想说给你们听听。如下是我很喜欢的一句话,我打算送给你们,希望我们都能变得更好更优秀。

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!

-------------------------------------------

⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

-------------------------------------------

猜你喜欢

转载自juejin.im/post/7107940804508778527