Java 8 特性

Java 8 特性

    • 1:Lambda 表达式
    • 2:方法引用
      • 构造器引用:
      • 静态方法引用:
      • 特定类的任意对象的方法引用:
      • 特定对象的方法引用:
    • 3:默认方法
      • 静态默认方法
      • 默认方法实例
    • 4:新工具
      • jjs
      • jjs 交互式编程
      • 传递参数
      • Java 中调用 JavaScript
      • JavaScript 中调用 Java
    • 5:Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
    • 6:Date Time API − 加强对日期与时间的处理。
    • 7:Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
    • 8:Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。

1:Lambda 表达式

− Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。

在关于 Java 8 文章的实例,我们均使用 jdk 1.8 环境,你可以使用以下命令查看当前 jdk 的版本:
$ java -version
java version “1.8.0_31”
Java™ SE Runtime Environment (build 1.8.0_31-b13)
Java HotSpot™ 64-Bit Server VM (build 25.31-b07, mixed mode)

编程风格

Java 8 希望有自己的编程风格,并与 Java 7 区别开,以下实例展示了 Java 7 和 Java 8 的编程格式:

import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;public class Java8Tester {public static void main(String args[]){List<String> names1 = new ArrayList<String>();names1.add("Google ");names1.add("Runoob ");names1.add("Taobao ");names1.add("Baidu ");names1.add("Sina ");List<String> names2 = new ArrayList<String>();names2.add("Google ");names2.add("Runoob ");names2.add("Taobao ");names2.add("Baidu ");names2.add("Sina ");Java8Tester tester = new Java8Tester();System.out.println("使用 Java 7 语法: ");tester.sortUsingJava7(names1);System.out.println(names1);System.out.println("使用 Java 8 语法: ");tester.sortUsingJava8(names2);System.out.println(names2);}// 使用 java 7 排序private void sortUsingJava7(List<String> names){   Collections.sort(names, new Comparator<String>() {@Overridepublic int compare(String s1, String s2) {return s1.compareTo(s2);}});}// 使用 java 8 排序private void sortUsingJava8(List<String> names){Collections.sort(names, (s1, s2) -> s1.compareTo(s2));}
}

执行以上脚本,输出结果为:

$ javac Java8Tester.java
$ java Java8Tester
使用 Java 7 语法: 
[Baidu , Google , Runoob , Sina , Taobao ]
使用 Java 8 语法: 
[Baidu , Google , Runoob , Sina , Taobao ]

2:方法引用

− 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

方法引用通过方法的名字来指向一个方法。

方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

方法引用使用一对冒号 ::

下面,我们在 Car 类中定义了 4 个方法作为例子来区分 Java 中 4 种不同方法的引用。

package com.xxxx.main;@FunctionalInterface
public interface Supplier<T> {T get();
}class Car {//Supplier是jdk1.8的接口,这里和lamda一起使用了public static Car create(final Supplier<Car> supplier) {return supplier.get();}public static void collide(final Car car) {System.out.println("Collided " + car.toString());}public void follow(final Car another) {System.out.println("Following the " + another.toString());}public void repair() {System.out.println("Repaired " + this.toString());}
}

构造器引用:

它的语法是Class::new,或者更一般的Class< T >::new实例如下:

final Car car = Car.create( Car::new );
final List< Car > cars = Arrays.asList( car );

静态方法引用:

它的语法是Class::static_method,实例如下:

cars.forEach( Car::collide );

特定类的任意对象的方法引用:

它的语法是Class::method实例如下:

cars.forEach( Car::repair );

特定对象的方法引用:

它的语法是instance::method实例如下:

final Car police = Car.create( Car::new );
cars.forEach( police::follow );

方法引用实例

import java.util.List;
import java.util.ArrayList;public class Java8Tester {public static void main(String args[]){List<String> names = new ArrayList();names.add("Google");names.add("Runoob");names.add("Taobao");names.add("Baidu");names.add("Sina");names.forEach(System.out::println);}
}

实例中我们将 System.out::println 方法作为静态方法来引用。
执行以上脚本,输出结果为:

$ javac Java8Tester.java 
$ java Java8Tester
Google
Runoob
Taobao
Baidu
Sina

3:默认方法

− 默认方法就是一个在接口里面有了一个实现的方法。

Java 8 新增了接口的默认方法。
简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。
我们只需在方法名前面加个 default 关键字即可实现默认方法。

为什么要有这个特性?
首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的 java 8 之前的集合框架没有 foreach 方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了解决接口的修改与现有的实现不兼容的问题。

语法

默认方法语法格式如下:

public interface Vehicle {default void print(){System.out.println("我是一辆车!");}
}

多个默认方法

一个接口有默认方法,考虑这样的情况,一个类实现了多个接口,且这些接口有相同的默认方法,以下实例说明了这种情况的解决方法:

public interface Vehicle {default void print(){System.out.println("我是一辆车!");}
}public interface FourWheeler {default void print(){System.out.println("我是一辆四轮车!");}
}

第一个解决方案是创建自己的默认方法,来覆盖重写接口的默认方法:

public class Car implements Vehicle, FourWheeler {default void print(){System.out.println("我是一辆四轮汽车!");}
}

第二种解决方案可以使用 super 来调用指定接口的默认方法:

public class Car implements Vehicle, FourWheeler {public void print(){Vehicle.super.print();}
}

静态默认方法

Java 8 的另一个特性是接口可以声明(并且可以提供实现)静态方法。例如:

public interface Vehicle {default void print(){System.out.println("我是一辆车!");}// 静态方法static void blowHorn(){System.out.println("按喇叭!!!");}
}

默认方法实例

我们可以通过以下代码来了解关于默认方法的使用,可以将代码放入 Java8Tester.java 文件中:

public class Java8Tester {public static void main(String args[]){Vehicle vehicle = new Car();vehicle.print();}
}interface Vehicle {default void print(){System.out.println("我是一辆车!");}static void blowHorn(){System.out.println("按喇叭!!!");}
}interface FourWheeler {default void print(){System.out.println("我是一辆四轮车!");}
}class Car implements Vehicle, FourWheeler {public void print(){Vehicle.super.print();FourWheeler.super.print();Vehicle.blowHorn();System.out.println("我是一辆汽车!");}
}

执行以上脚本,输出结果为:

$ javac Java8Tester.java 
$ java Java8Tester
我是一辆车!
我是一辆四轮车!
按喇叭!!!
我是一辆汽车!

4:新工具

− 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。

Nashorn 一个 javascript 引擎。

Nashorn JavaScript Engine 在 Java 15 已经不可用了

这已经在 Java 11 标记为:

@deprecated (forRemoval = true)

从 JDK 1.8 开始,Nashorn取代Rhino(JDK 1.6, JDK1.7) 成为 Java 的嵌入式 JavaScript 引擎。Nashorn 完全支持 ECMAScript 5.1 规范以及一些扩展。它使用基于 JSR 292 的新语言特性,其中包含在 JDK 7 中引入的 invokedynamic,将 JavaScript 编译成 Java 字节码。

与先前的 Rhino 实现相比,这带来了 2 到 10倍的性能提升。

jjs

jjs是个基于Nashorn引擎的命令行工具。它接受一些JavaScript源代码为参数,并且执行这些源代码。
例如,我们创建一个具有如下内容的sample.js文件:

print('Hello World!');

打开控制台,输入以下命令:

$ jjs sample.js

以上程序输出结果为:

Hello World!

jjs 交互式编程

打开控制台,输入以下命令:

$ jjs
jjs> print("Hello, World!")
Hello, World!
jjs> quit()
>>

传递参数

打开控制台,输入以下命令:

$ jjs -- a b c
jjs> print('字母: ' +arguments.join(", "))
字母: a, b, c
jjs> 

Java 中调用 JavaScript

使用 ScriptEngineManager, JavaScript 代码可以在 Java 中执行,实例如下:

import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;public class Java8Tester {public static void main(String args[]){ScriptEngineManager scriptEngineManager = new ScriptEngineManager();ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn");String name = "Runoob";Integer result = null;try {nashorn.eval("print('" + name + "')");result = (Integer) nashorn.eval("10 + 2");}catch(ScriptException e){System.out.println("执行脚本错误: "+ e.getMessage());}System.out.println(result.toString());}
}

执行以上脚本,输出结果为:

$ javac Java8Tester.java 
$ java Java8Tester
Runoob
12

JavaScript 中调用 Java

以下实例演示了如何在 JavaScript 中引用 Java 类:

var BigDecimal = Java.type('java.math.BigDecimal');function calculate(amount, percentage) {var result = new BigDecimal(amount).multiply(new BigDecimal(percentage)).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_EVEN);return result.toPlainString();
}var result = calculate(568000000000000000023,13.9);
print(result);

我们使用 jjs 命令执行以上脚本,输出结果如下:

$ jjs sample.js
78952000000000002017.94

5:Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。

6:Date Time API − 加强对日期与时间的处理。

7:Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。

8:Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。

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

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

相关文章

sm2和aes加解密

引用maven包 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk18on</artifactId><version>1.72</version></dependency>2.对报文进行加密后生成签名 {// oristr报文 SECRET_KEY加密密钥String encrypt…

STM32标准库开发—SPI通信介绍

SPI通信 硬件电路 注意&#xff1a;为避免输入信号&#xff08;MISO&#xff09;造成冲突&#xff0c;只有被SS选中的设备才能使用MISO进行通信&#xff0c;空闲状态下该引脚呈现高阻态模式 SPI信号移位示意图 主机与从机通过交换时序实现数据传输&#xff0c;无论要与不要都需…

一个简单好用的C语言单元测试框架-Unity

Unity简介&#xff1a; Unity是一个用于C语言的轻量级单元测试框架。它由Throw The Switch团队开发&#xff0c;旨在简化嵌入式系统的单元测试。单元测试中单元的含义&#xff0c;单元就是人为规定的最小的被测功能模块&#xff0c;如C语言中单元指一个函数&#xff0c;Java里…

python文件操作的基本流程

引入 程序运行过程中产生的数据会保存到内存中&#xff0c;如果想要永久保存下来&#xff0c;就必须将数据存放在硬盘上&#xff0c;应用程序如果想要操作计算机的硬件就必须通过操作系统&#xff0c;文件就是操作系统提供给应用程序来操作硬盘的虚拟概念&#xff0c;应用程序…

数据结构:顺序循环队列

队列是限制在两端操作进行插入操作与删除操作的线性表&#xff0c;允许进行插入操作的一端称为"队尾"&#xff0c;允许进行删除操作的一端称为“队头”。当线性表中没有元素时&#xff0c;称为“空队”。队列的特点是先进先出。 队列两种规定&#xff1a; 1、front…

使用RSVP进行带宽预留

使用RSVP进行带宽预留 服务质量&#xff08;QoS&#xff09;工具包括 标记&#xff0c; 管制和 整形 机制&#xff0c;主要是区分服务&#xff08;DiffServ&#xff09;工具。DiffServ机制可提供带宽保证&#xff08;在各种刚性级别上&#xff09;&#xff0c;但是它们都不提供…

多种事件使用----

复习&#xff1a;2024-1-20 一、html部分 1.图片标签&#xff1a; <img src"路径" > ​<img src"../imgs/tu.jpg" alt"这里本来有一张图片" title"这是一张风景图" width"100%" height"100%"> src…

B站提示:“当前浏览器版本较低……”可行的解决方案(edge浏览器)

文章目录 问题研究和分析使用User-Agent Switcher for Chrome插件的解决方法使用userAgent switcher的解决方法 问题研究和分析 问题&#xff1a;使用最新版浏览器访问B站&#xff0c;首页总是有一条横幅提示&#xff1a;当前浏览器版本较低&#xff0c;为保证您的使用体验&am…

JS-WebAPIs- Window对象(五)

• BOM(浏览器对象模型) BOM(Browser Object Model ) 是浏览器对象模型 window对象是一个全局对象&#xff0c;也可以说是JavaScript中的顶级对象像document、alert()、console.log()这些都是window的属性&#xff0c;基本BOM的属性和方法都是window的。所有通过var定义在全局…

cmake构建和简单实操

构建方式 有两种构建方式&#xff0c;分别为内部构建和外部构建。 内部构建 &#xff08;不建议使用&#xff09; 内部构建会在 同级目录下产生一大堆中间文件&#xff0c;这些中间文件并不是我们最终所需要的&#xff0c;和工程源文件放在一起会显得杂乱无章。 外部构建&…

一键合并,轻松管理,尽在新一代TXT文本管理工具

你是否经常遇到多个文本文件需要合并的情况&#xff1f;是否曾经为了整理这些文件而头痛不已&#xff1f;现在&#xff0c;我们为你带来了一款全新的TXT文本管理工具&#xff0c;让你一键即可合并多个TXT文本&#xff0c;轻松管理你的文本文件 首先&#xff0c;在首助编辑高手…

【蓝桥杯日记】复盘篇一:深入浅出顺序结构

&#x1f680;前言 本期是一篇关于顺序结构的题目的复盘,通过复盘基础知识&#xff0c;进而把基础知识学习牢固&#xff01;通过例题而进行复习基础知识。 &#x1f6a9;目录 前言 1.字符三角形 分析&#xff1a; 知识点&#xff1a; 代码如下 2. 字母转换 题目分析: 知…

Mac M1 Parallels CentOS7.9 Deploy Typecho

一、创建名称空间 kubectl create ns prod二、创建PV & PVC vim local-pv1.yamlapiVersion: v1 kind: PersistentVolume metadata:name: local-pv-1 spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: loca…

使用JFLASH实现文件程序自动化合并及下载功能

主要总结下使用 SEGGER 工具集的 JFLASH 软件实现hex/bin文件合并以及程序的自动下载使用方法。 起因是最近使用到LVGL字库文件的制作&#xff0c;每次都要将分散的bin文件按既定分配的偏移作合并处理&#xff0c;刚开始使用的是二进制文件合并工具,文件少的时候还行&#xff…

Mediapipe框架介绍及使用说明

介绍 Mediapipe是Google开发的一款开源的跨平台框架&#xff0c;用于构建实时多媒体应用程序。它提供了一系列预训练的机器学习模型和工具&#xff0c;可以用于各种计算机视觉、音频处理和姿态估计等任务。 特点 Mediapipe库的主要特点包括&#xff1a; 1.实时性能&#xff…

mysql 容器化安装(docker)离线和在线

前言&#xff1a;在部署hive或airflow 升级过程中&#xff0c;总需要一个对应的数据库存储元数据&#xff0c;一个轻量级的mysql容器刚刚好。轻量、可快速移植、具有隔离性。 文章目录 1、查看机器版本2、安装 docker3、启动docker 服务4、docker 常用命令docker5、拉取mysql …

6种解决msvcp140.dll文件丢失的有效方法讲解

msvcp140.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2015 Redistributable的一部分。这个文件通常位于Windows操作系统的System32文件夹中&#xff0c;它包含了许多用于支持C编程语言的函数和类。当您在运行一个需要使用这些函数和类的应用程序时&#xff0c…

支付宝小程序开发踩坑笔记(支付宝、学习强国小程序)

1、接口请求安卓端回调 success&#xff0c;IOS 端回调 fail 原因&#xff1a;dataType 设置不对&#xff0c;默认是 json 格式&#xff0c;对返回数据会进行 json 解析&#xff0c;如果解析失败&#xff0c;就会回调 fail 。加密传输一般是 text 格式。 2、input 禁止输入空格…

【Docker】未来已来 | Docker技术在云计算、边缘计算领域的应用前景

欢迎来到英杰社区&#xff1a; https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区&#xff1a; https://bbs.csdn.net/topics/617897397 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff…

实现分布式锁:Zookeeper vs Redis

目录 引言 1. Zookeeper分布式锁 1.1特点和优势&#xff1a; 强一致性 顺序节点 Watch机制 1.2 Zookeeper分布式锁代码示例 2. Redis分布式锁 2.1特点和优势&#xff1a; 简单高效 可续租性 灵活性 2.2Redis分布式锁代码示例 3.对比和选择 3.1 一致性要求 3.2…