Java 8 的这些特性,你知道吗?

关于Java你不知道的之Java8新特性:HashMap优化 参考:HashMap初始容量为什么是2的n次幂首先看看HashMap中添加元素是怎么存放的第一个截图是向HashMap中添加元素putVal()方法的部分源码,可以看出,向集合中添加元素时,会使用(n - 1) & hash的计算方法来得出该元素在集合中的位置; 阅读详情

作为一个心怀大教堂之愿景的搬砖码农,伴着一行代码一块砖的节奏,生产环境上 JDK 的版本从 1.4 逐步升级到 8。

而 JDK 都到 14 啦,而多数程序员编写的代码依然停滞在 Java 6,而每当看到小鲜肉写的代码,到处都是 Lambda 表达式、流式操作 Stream API ... ...,着实很懵 B。

为了能跟小鲜肉看齐,老码农很有必要熟练一下 Java 8 的那些新特性啦。

1. 函数式接口  

如 Runnable 源码所示,接口中定义了唯一一个抽象方法 run,那么类似这种的接口,在 Java 8 中称之为函数式接口,是 Java 8 引入的一个核心概念。

仔细看 Runnable 的源码,会发现引入了一个新的注解:@FunctionalInterface,用来表示这个接口是一个函数式接口。

@FunctionalInterface 这个注解是非必须的,若接口只包含一个方法的接口,虚拟机会自动判断,不过最好在接口上使用注解 @FunctionalInterface 进行声明。在接口中添加了 @FunctionalInterface 的接口,只允许有一个抽象方法,否则编译器也会报错。

2. Lambda 表达式  

Lambda 表达式是推动 Java 8 发布的最重要新特性,可以使用 Lambda 实例化函数式接口。

在 Java 8 之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差,而采用 Lambda 表达式则可以使代码变的更加简洁紧凑。

(图片来源于网络)

代码片段一:

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("我是一个孤独的线程");
    }
});

上面代码是创建线程的代码片段,这种代码很常见,而采用 Lambda 表达式,则会很简洁。

new Thread(() -> System.out.println("我是一个孤独的线程"));

很显然,代码确实是简化了不少。代码是否能读懂?没关系,稍后做解释。

代码片段二:

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("一个孤独的按钮被操作");
    }
});

上面的代码片段,是采用匿名内部类给按钮添加监听,而采用 Lambda 表达式,会是什么效果呢?

button.addActionListener((ActionEvent e) -> System.out.println("一个孤独的按钮被操作"));

哎呦,我去!妥妥的一行代码搞定,确实简化了不少。

烟味灭酒过半,是时候真正认识一下 Lambda 表达式啦。

Lambda 表达式

Lambda 表达式,由三个部分组成。

第一部分:为一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数,例如代码片段二中的参数 ActionEvent e;

第二部分:为一个箭头符号:->;

第三部分:为方法体,可以是表达式和代码块。

具体语法如下:

(parameters) -> expression //当方法体为表达式时
或
(parameters) -> { statements; } //当方法体为代码块时

当方法体为表达式时,示例:

(int n1,int n2) -> return n1 + n2; //求和,该表达式的值作为返回值返回。

当方法体为代码块时,示例:

(String s) -> {System.out.println(s);} //打印,无返回值
(int a, int b) -> { return a * b; }; //大括号中的返回语句
‍

Lambda 表达式的语法很简单,不过有些准则还是要提一提。

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。

  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。

  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。

  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指明表达式返回了一个数值。

那回头看看开篇提到的代码片段一、片段二,看完它们的简化过程,就很容易理解啦。

代码片段一,简化过程:

代码片段二,简化过程:

通过上面两段代码的简化过程,很显然使用 Lambda 表达式,可以很大程度上简化代码。

3. Stream:流式操作  

Java 8 引入了流式操作(Stream),通过流式操作可以实现对集合的并行处理和函数式操作,想象成把要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

最重要的是:通过 Stream API 可以让程序员写出高效率、干净、简洁的代码。 Talk is cheap. Show me the code. 

代码片段一:「filter」从集合中找出符合条件的数据。

List<String> names = Arrays.asList("一猿小讲","一猿小将","一员小讲");
// 统计名字列表中以 讲 结尾的个数
long count = names.stream().filter(name -> name.endsWith("讲")).count();

代码片段二:「forEach」对集合中的数据进行迭代。

List<String> names = Arrays.asList("一猿小讲","一猿小将","一员小讲");
// 统计名字以 讲 结尾的的名字,并进行迭代输出
names.stream().filter(name -> name.endsWith("讲")).forEach(name -> System.out.println(name));

代码片段三:「findAny」 vs「findFirst」。

List<String> names = Arrays.asList("一猿小讲", "一猿小将", "一员小讲");
// findAny 从列表中任意找出一个符合条件的数据
Optional<String> any = names.stream().filter(name -> name.endsWith("讲")).findAny();
// findFirst 从列表中找出第一个符合条件的数据
Optional<String> first = names.stream().filter(name -> name.endsWith("讲")).findFirst();

代码片段四:「sorted」对流进行排序。

List<String> names = Arrays.asList(" 8888 ", " 6666 ", " 9999 ");
// 按照默认排序规则进行排序,当然可以自定义排序规则
names.stream().sorted().forEach(name -> System.out.print(name));
// 输出:6666  8888  9999

代码片段五:「distinct」去除重复元素。

List<String> names = Arrays.asList("一猿小讲", "一猿小将", "一员小讲", "一猿小讲");
// 去除重复元素,并迭代输出
names.stream().distinct().forEach(name -> System.out.println(name));

代码片段六:「limit」获取指定数量的流。

List<String> names = Arrays.asList("一猿小讲", "一猿小将", "一员小讲", "一猿小讲");
// 获取 2 条数据,并迭代输出
names.stream().limit(2).forEach(name -> System.out.println(name));

代码片段七:「map」映射每个元素对应的结果。

List<String> names = Arrays.asList("一猿小讲", "一猿小将", "一员小讲", "一猿小讲");
// 针对每个姓名进行追加 @NB
names.stream().map(name -> name + "@NB").forEach(name -> System.out.println(name));

还有很多 Stream 的 API,不再一一举例,用法套路都差不多,其实是一个熟能生巧的过程。

4. 寄语写最后 

本次,主要对 Java 8 中引入的部分新特性,进行初步的讲解。若想要快速投入实战,还要靠各位下去结合本文的代码片段进行多写、多悟,写着写着就有感觉啦,油从钱孔入而钱不湿唯手熟而已。

好了,本次就谈到这里,一起聊技术、谈业务、喷架构,少走弯路,不踩大坑。会持续输出原创精彩分享,敬请期待!参考链接:

    https://www.runoob.com/java/java8-streams.html

    https://www.runoob.com/java/java8-lambda-expressions.html

    https://www.ibm.com/developerworks/cn/java/j-lo-jdk8newfeature/

推荐阅读:

fastjson的这些坑,你误入了没?

真实|技术人员该如何站好最后一班岗?

改掉这些坏习惯,还怕写不出健壮的代码?(一)

改掉这些坏习惯,还怕写不出优雅的代码?(二)

改掉这些坏习惯,还怕写不出优雅的代码?(三)

改掉这些坏习惯,还怕写不出健壮的代码?(四)

改掉这些坏习惯,还怕写不出精简的代码?(五)

改掉这些坏习惯,还怕写不出精简的代码?(六)

坚持是一种信仰,在看是一种态度!

您知道Java8有哪些新特性吗? Java 8 新特性概览 Java 8 引入了多项重要特性,显著提升了开发效率和代码可读性。核心特性包括: Lambda 表达式:简化匿名内部类,支持函数式编程 Stream API:提供声明式数据处理能力 接口默认方法与静态方法:增强接口扩展性 Optional 类:优雅处理空指针异常 方法引用:进一步简化 Lambda 表达式 新日期时间 API:替代 Date/Calendar 并行数组处理:提升多核性能 Base64 编解码:内置支持 Nashorn JavaScript 引擎... 阅读详情

相关推荐

jav8:基于 Google V8 Javascript 引擎的 Java Scripting API (JSR223) 实现

基于 Google V8 Javascript 引擎的 Java Scripting API (JSR223) 的实现。 Java 规范请求 (JSR) 223 通过定义标准框架和应用程序编程接口 (API) 来帮助开发人员集成 Java 技术和脚本语言,以执行以下操作: 从脚本环境访问和控制基于 Java 技术的对象 使用脚本语言创建 Web 内容 在基于 Java 技术的应用程序中嵌入脚本环境 有关更多详细信息,请阅读 要使用 Jav8 脚本引擎,请将文件 jav8-jsr223-xxx.jar 放在您的类路径中。 然后你可以通过这种方式获得引擎的一个实例: ScriptEngineManager factory = new ScriptEngineManager (); ScriptEngine engine = factory . getEngineByName( " ja

Jav8不能错过的时间操作

java8之前的时间操作都过于复杂,java8之后推出了一个新的时间类,方便了时间上的操作。下面我们来解析一个基于java8新的时间类的各种操作方式 将时间格式转为对应的LocalDateTime String openTimeStr = "2021-03-09 10:00:00"; LocalDateTime serverOpenDate = LocalDateTime.parse(openTimeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:s.

海神九考 1万+

jav-8-openjdk-amd64.tar.gz

用于linux 编译好的的java jdk,可以用来编译android 7.1

JAVA8独有的map遍历方式(非常好用)

使用JAV8 带来的map遍历方式使遍历非常简单 public class LambdaMap { private Map<String, Object> map = new HashMap<>(); @Before public void initData() { map.put("key1", "value1"); ...

weixin_44213038的博客 2703

java视频种子(超多30G)

全是学习的视频,2010传智播客struts2.1.8视频教程,张孝祥Java基础加强,还有面试题

jav.rar_JAV301_JAV388_JAV第8页_jav674_javclass.com

一些关于java程序的小练习。小型的程序。

关于Java你不知道的那些事之Java8新特性[HashMap优化]

Java8新特性[HashMap优化]前言其他主要新特性HashMap优化HashMap1.7HashMap1.7存在死链问题HashMap每次扩容为什么是2倍JDK1.8结构变化ConcurrentHashMap变化为何JDK8要放弃分段锁?内存结构优化总结 前言 本文开始重温Java8新特性之HashMap优化,后续还会重温其他主要新特性,敬请期待,点点关注不迷路哦!! 其他主要新特性 Lambda表达式 函数式接口 方法引用与构造器引用 Stream API 接口中默认方法与静态方法 新时间日期

轻狂书生FS的博客 3691

JAV.zip_jaV.H0D_jav.com_jav513_javjobvideo日韩_vjav

yrtos_ MULTITASKING RTOS,.

你知道java8的新特性 Lambda

你知道java8的新特性吗,请简单介绍一下 Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。 方法引用− 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。 默认方法− 默认方法就是一个在接口里面有了一个实现的方法。 新工具− 新的编译工具,如...

疯 466

FreeRtos——10、全局看门狗设计

RTOS 里的看门狗不只是为了证明 CPU 还在动,而是为了证明每个业务逻辑都在按预期的节奏“呼吸”。

qq_40170041的博客 900

带标签的PHM2009齿轮箱数据集

PHM2009附加数据集—带标签的齿轮箱数据集,可用于测试算法

qq_39379705的博客 4873

java8 lambda map<list>排序_Java 8 的这些特性,你知道吗?

作为一个心怀大教堂之愿景的搬砖码农,伴着一行代码一块砖的节奏,生产环境上 JDK 的版本从 1.4 逐步升级到 8。而 JDK 都到 14 啦,而多数程序员编写的代码依然停滞在 Java 6,而每当看到小鲜肉写的代码,到处都是 Lambda 表达式、流式操作 Stream API ... ...,着实很懵 B。为了能跟小鲜肉看齐,老码农很有必要熟练一下 Java 8 的那些新特性啦。函数式接口 如...

weixin_39599097的博客 166

Power BI财销一体分析——KPI分析应用实践

第九步:插入三个散点图,行拖入分销商表分销商字段,将度量值中的销量拖入X轴,将利润拖入Y轴,大小拖入度量值总销售额,将分销商表业务类型字段作为筛选条件添加给散点图,分别选择专业自行车店、增值经销商、仓库,使视觉对象固定显示不同业务类型的散点分布。这个公式其实是不需要我们自己写的,依赖于快度量值功能星级评分,基值选择度量值总销售额,星数选择5,最低星值评分选择0,最高星级评分值选择100,点击添加,星级评分度量值就建立好了,接下来我们理解一下公式。好的,今天的讲解就到这里。

BI瓶子的博客 1552

8个你必须知道的Java8新特性,让你的代码变得优雅!

需要注意的是,这些接口默认方法并不是强制实现的,也可以被继承类或实现类所覆盖和重写。Java 8中的方法引用是一种简化Lambda表达式的方式,它允许我们直接引用已存在的 Java 类或对象的方法,而不需要通过 Lambda 表达式再去定义一个新的函数式接口实现。其中通过串行流(Stream)和并行流(Parallel Stream)两种方式,分别实现了对数据的操作,并在控制台输出操作所消耗的时间。方法:如果值存在则返回该值,否则运行参数中的 Supplier 函数,并返回该函数的结果。

林夕 3434

Mac 环境配置jdk、Maven

3、终端打开配置jdk时候建好的脚本文件: open -e .bash_profile。4、查看maven是否安装成功和系统能不能识别maven/mvn命令:⬇️。输入⬇️并保存: 其中第一行JAVA_HOME替换为自己下的jdk路径。,安装编译好的二进制版本,具体安装zip还是tar.gz我看的。5、查看jdk是否安装成功和系统能不能识别java命令:⬇️。至此,我的Mac系统的环境配置jdk、Maven完成!然后就发现我的maven命令还是没作用,不识别,下载后直接安装即可,很快,点几下就OK了。

weixin_42416791的博客 4397

GEE 案例分析:利用Landsat数据进行FAI、NDVI及CHLA分析并统计平均值(巢湖为例)

浮游藻类指数(FAI)、归一化植被指数(NDVI)及叶绿素a(CHLA)是水体环境监测的重要指标。本文利用Google Earth Engine(GEE)平台,基于Landsat 5和Landsat 8数据,进行水体藻类及植被监测。

此星光明博客 1336

用了这么久你还不知道Java 8到底有哪些新特性?

一、接口的默认方法(Default Methods for Interfaces) Java 8使我们能够通过使用 default 关键字向接口添加非抽象方法实现。 此功能也称为虚拟扩展方法。 第一个例子: interface Formula{ double calculate(int a); default double sqrt(int a) { return Math.sqrt(a); } } Formula 接口中除了抽象方法计算接口公式还定义了默认方法 sqrt 。 实现

代码时光 429

FPGA实现串口升级及MultiBoot(十)串口升级SPI FLASH实现

采用软核进行串口升级的原因主要有以下几点:1、官方推荐:官方以前也推出了针对逻辑进行升级的程序《XAPP1081_QuickBoot》,但是从今年起(2024年)官方就停止更新相关例程了(详见下面截图),所以采用官方推荐的软核更新;2、简单并具有通用性:针对SPI或者BPI官方都有相关的IP,可应对市场上80%以上的FLASH,并且官方IP通用性极强,只需要修改几个参数就可以对不同厂家的芯片进行升级操作;

OpenFPGA的博客 1996

java8中让你代码风格提升的特性你得知道

jdk8新特性 Java8 新增了非常多的特性,我们主要讨论以下几个: Lambda 表达式 − Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。 默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。 新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。 Stream

weixin_47088026的博客 154

学Simulink--基于电力电子变换器的建模与仿真实例:LLC谐振变换器在高频AC-DC转换中的建模

本文详细介绍了使用Simulink+Simscape Electrical对LLC谐振变换器进行建模与仿真的完整流程。LLC谐振变换器因其高效率、低噪声的特点,广泛应用于高频AC-DC转换场景。文章从背景原理出发,逐步讲解系统结构设计、建模步骤(包括AC源、整流器、LLC变换器、负载等模块搭建)、控制策略实现(固定频率/变频/PID控制)和仿真设置。通过分析仿真结果的关键指标,提出参数整定和算法优化建议。该建模方法为电力电子设计人员提供了实用的仿真工具,有助于优化LLC变换器性能,缩短开发周期。

xiaoheshang_123的博客 298

【Unity实战篇】 接入百度翻译,实现文本自动翻译功能

日常在做项目的过程中,游戏本地化几乎已经成为必不可少的一步。 本篇文章将演示怎样在Unity中接入百度翻译,实现文本自动翻译的功能。

努力前行,总会成为自己心中的那道光 9059

java13都快发布了java8的新特性你知道多少

java13都快发布了java8的新特性你知道多少 一、Lambda表达式 箭头函数 二、接口的默认方法和静态方法 三、方法引用 通常与Lambda表达式联合使用,可以直接引用已有Java类或对象的方法。一般有四种不同的方法引用: 构造器引用。语法是Class::new,或者更一般的Class< T >::new,要求构造器方法是没有参数; 静态方法引用。语法是Class::s...

baidu_39352786的博客 785

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java8新特性你知道哪些?

lambda表达式是 Java 8 的一个新特性,可以取代大部分的匿名内部类,简化了匿名委托的使用,让你让代码更加简洁,优雅。比较官方的定义是这样的:lambda 表达式是一个可传递的代码块(或者匿名函数),可以在以后执行一次或多次。这个匿名函数没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。lambda表达式也可称为闭包。在 Java 中传递一个代码段并不容易,你不能直接传递代码段。...

Java_ttcd的博客 217

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

关于Java你不知道的那些事之Java8新特性[Stream API]

Java8新特性[Stream API]前言区别什么是StreamStream操作的三部曲创建流中间操作终止操作Stream流的操作筛选与切片映射排序终止操作规约收集总结 前言 了解Stream Java8中有两个比较大的改变 Lambda表达式 Stream API (java.util.stream.*) Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找,过滤和映射数据等操作。使用Stream API对集合数据进行操作,就类似于使用SQL执

轻狂书生FS的博客 2350

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【Java8新特性】你知道Java8为什么要引入Lambda表达式吗?

写在前面 这是一道真实的面试题,一个读者朋友出去面试,面试官竟然问他这样一个问题:你说说Java8中为什么引入Lambda表达式?引入Lambda表达式后有哪些好处呢?还好这个朋友对Java8早有准备。不过,如果是看文章的你出去面试,面试官问你这样的问题,你是否也能轻松回答呢? 什么是Lambda表达式? Lambda表达式是一个匿名函数,我们可以这样理解Lambda表达式:Lambda是一段...

冰河的专栏 2701
上一篇: fastjson的这些坑,你误入了没?
下一篇: Java程序跑的快,全要靠线程带
一猿小讲
博客等级 码龄15年 294粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值