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

一、概述 

       ​上几期,我们是完整的学完了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>() {@Overridepublic int compare(String o1, String o2) {return o2.charAt(0) - o1.charAt(0);}});

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

    @Testpublic 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流*/@Testpublic void testCreateStream1() {//创建一个集合//存放全班同学姓名集合List<String> stus = new ArrayList<>();stus.add("马超");stus.add("李白");//使用Stream计数。long count = stus.stream().count();}

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

代码演示如下:

    /*** 第二种:通过数组创建Stream流*/@Testpublic void testCreateStream2() {//创建一个数组String[] arr = new String[10];long count = Arrays.stream(arr).count();}

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

代码演示如下:

    /*** 第三种:通过Stream.of()方法Stream流*/@Testpublic void testCreateStream3() {//定义一个数组。String[] arr = new String[10];long count = Stream.of(arr).count();}

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

代码演示如下:

    /*** 第四种:通过Stream.iterate(),创建无限流。*/@Testpublic 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。而最后一步,终止操作,就是执行中间链操作处理出结果。

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

    @Testpublic 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方法,其实就足够了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/296460.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac OS上使用matplotlib库显示中文字体

文章目录 问题描述解决步骤参考文章 问题描述 如果我们想要使用matplotlib画图的话&#xff0c;可能会出现下面的这种warning: UserWarning: Glyph 24212 (\N{CJK UNIFIED IDEOGRAPH-5E94}) missing from current font.解决步骤 解决这个问题&#xff0c;可以按照下面的做法…

SpringBoot全局异常处理

问题 当我们没有做任何的异常处理时&#xff0c;我们三层架构处理异常的方案&#xff1a; Mapper接口在操作数据库的时候出错了&#xff0c;此时异常会往上抛(谁调用Mapper就抛给谁)&#xff0c;会抛给service。 service 中也存在异常了&#xff0c;会抛给controller。 而在…

Python基于深度学习的人脸识别项目源码+演示视频,利用OpenCV进行人脸检测与识别 preview

​ 一、原理介绍 该人脸识别实例是一个基于深度学习和计算机视觉技术的应用&#xff0c;主要利用OpenCV和Python作为开发工具。系统采用了一系列算法和技术&#xff0c;其中包括以下几个关键步骤&#xff1a; 图像预处理&#xff1a;首先&#xff0c;对输入图像进行预处理&am…

鸿蒙南向开发案例:【智能养花机】

样例简介 智能养花机通过感知花卉、盆栽等植宠生长环境的温度、湿度信息&#xff0c;适时为它们补充水分。在连接网络后&#xff0c;配合数字管家应用&#xff0c;用户可远程进行浇水操作。用户还可在应用中设定日程&#xff0c;有计划的按日、按周进行浇水。在日程中用户可添…

Servlet原理Servlet API

目录 一、Servlet运行原理 1.1、问题 1.2、Servlet的具体执行过程 1.3、Tomcat初始化流程小结 1.4、Tomcat处理请求流程 二、Servlet API详解 2.1、HttpServlet类 2.1.1、处理Get请求 2.2、HttpServletRequest类 2.3、HttpServletResponse类 2.3.1、设置状态码 ​2.…

二维码的生成、下载Java,并返回给前端展示

分析 将生成的二维码图片&#xff0c;以IO流的方式&#xff0c;通过response响应体直接返回给请求方。 第一、不需要落到我们的磁盘&#xff0c;操作在内存中完成&#xff0c;效率比较高。 第二、所有生成二维码的请求&#xff0c;都可以访问这里&#xff0c;前端直接拿img标…

【tools】Lokalise 可用于本地化各种类型的应用程序和网站

【tools】Lokalise 可用于本地化各种类型的应用程序和网站 1. Lokalise 基本功能2. Lokalise 可用于本地化各种类型的应用程序和网站,那部署的应用程序和网站运行再什么地方,数据存储再什么位置?https://app.lokalise.com/quick-start 1. Lokalise 基本功能 Lokalise 是一款…

RUST语言基本数据类型认识

1.RUST的基本数据类型参考: 2.使用RUST数据类型声明变量并赋值: let a:i81;//8位有符号整数let a1:u82;//8位无符号整数let b:i161;//16位有符号整数let b1:u162;//16位无符号整数let c:i321;//32位有符号整数let c1:u322;//32位无符号整数let d:i641;//64位有符号整数let d1:u…

Java零基础入门-java8新特性(上篇)

一、本期教学目标 java8有哪些新特性什么是函数式接口什么是Lambda表达式掌握Stream ApiStream和Collect集合区别Stream创建方式Stream操作三步骤 二、概述 上几期&#xff0c;我们是完整的学完了java异常类的学习及实战演示、以及学习了线程进程等基础概念&#xff0c;而这一…

VSCode调试C++

1、环境准备 1.1、g的安装与使用 1.1.1、安装 方式一&#xff1a;Xcode安装 苹果的开发集成工具是Xcode.app&#xff0c;其中包含一堆命令行工具。 在 App store 可以看到其大小有好几个G&#xff0c;有点大。 方式二&#xff1a;Command Line Tools 安装 Command Line Too…

算法知识点汇总

知识点 1. 求二进制中1的个数 int get_count(int x)//返回x的二进制有多少个1 int get_count(int x) {int res 0;while (x){res ;x - x & -x;}return res; }2. 建树&#xff0c;和树的DFS 记得初始化头节点 const int N 1e5 10, M N * 2; int h[N], e[M], ne[M], id…

【智能算法】猎豹优化器(CO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年&#xff0c;MA Akbari等人受到自然界中猎豹捕猎行为启发&#xff0c;提出了猎豹优化器&#xff08;The Cheetah Optimizer&#xff0c;CO&#xff09;。 2.算法原理 2.1算法思想 CO法对猎…

Shell GPT:直接安装使用的chatgpt应用软件

ShellGPT是一款基于预训练生成式Transformer模型&#xff08;如GPT系列&#xff09;构建的智能Shell工具。它将先进的自然语言处理能力集成到Shell环境中&#xff0c;使用户能够使用接近日常对话的语言来操作和控制操作系统。 官网&#xff1a;GitHub - akl7777777/ShellGPT: *…

使用vuepress搭建个人的博客(一):基础构建

前言 vuepress是一个构建静态资源网站的库 地址:VuePress 一般来说,这个框架非常适合构建个人技术博客,你只需要把自己写好的markdown文档准备好,完成对应的配置就可以了 搭建 初始化和引入 创建文件夹press-blog npm初始化 npm init 引入包 npm install -D vuepress…

【C++】C++11类的新功能

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 默认成员函数 类成…

Windows下编译TinyXML(XML文件解析)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 TinyXML是什么&#xff1f; TinyXML是一个轻量级的C XML解析器&#xff0c;它提供了一种简单的方法来解析和操作XML文档。TinyXM…

Camtasia Studio2024汉化版下载(功能强大的屏幕录制和视频编辑软件)

Camtasia Studio 2024是一款功能强大的屏幕录制和视频编辑软件&#xff0c;由TechSmith公司开发。这款软件不仅能够帮助用户轻松地记录电脑屏幕上的任何操作&#xff0c;还可以将录制的视频进行专业的编辑和制作&#xff0c;最终输出高质量的视频教程、演示文稿、培训课程等。 …

Termius for Mac v8.4.0激活版下载

Termius for Mac是一款功能强大的多协议远程管理软件&#xff0c;专为开发人员、系统管理员和网络专业人士设计。它支持多种远程连接协议&#xff0c;如SSH、Telnet、RDP、VNC和RFB等&#xff0c;使得用户可以轻松连接到不同类型的远程服务器和设备。 软件下载&#xff1a;Term…

企业家升维认知:引领企业持续发展的关键

一、引言 在快速变化的时代背景下&#xff0c;企业家面临着前所未有的挑战与机遇。新东方教育科技集团董事长俞敏洪曾深刻指出&#xff1a;“企业家本身要不断升维自己的认知&#xff0c;才能带领企业持续发展。”这句话不仅揭示了企业家认知升维的重要性&#xff0c;也为我们…

高效准确!指甲剪盖片视觉检测技术解密

指甲剪的盖片是指指甲剪的一端&#xff0c;通常用来盖住另一端的刀刃部分。指甲剪盖片是指甲剪的重要部分&#xff0c;除了保护刀刃外&#xff0c;还起到美观和便捷的作用。正确使用和保养指甲剪盖片可以延长指甲剪的使用寿命。 本案是对指甲剪盖片最大尺寸长75mm*宽10mm*高3mm…