Java 各个版本中的新特性
新特性你知道多少?
Java 8
Java 8 中主要的新特性有4个。
Lambda 表达式
Lambda 表达式允许将函数作为一个方法的参数,即把函数作为参数传递进方法中。
示例如下:
public class Lambda {
public static void main(String[] args) {
// 类型声明
MathOperation addition = (int a, int b) -> a + b;
// 不用声明类型
MathOperation subtraction = (a, b) -> 0;
// 大括号中的返回语句
MathOperation multiplication = (int a, int b) -> { return a * b; };
// 没有大括号及返回语句
MathOperation division = (int a, int b) -> a / b;
Lambda lambda = new Lambda();
System.out.println(lambda.operate(1,2,addition));
}
interface MathOperation {
int operation(int a, int b);
}
interface GrecetingService {
void sayMessage(String message);
}
private int operate(int a, int b, MathOperation mathOperation) {
return mathOperation.operation(a, b);
}
}
接口增加默认方法等
在 Java 8 以前,接口中只能有常量和抽象方法,不能含有方法的实现。但是在 Java 8 中,我们可以对接口添加默认实现,还可以实现静态方法。
示例:
public class InterfaceDefault {
public static void main(String[] args) {
}
class LogOracle implements logging {
}
interface logging {
String ORACLE = "Oracle_Database";
String MYSQL = "Mysql_Database";
default void logInfo(String message) {
getConnection();
System.out.println("Log Message : " + "INFO");
closeConnection();
}
static void getConnection() {
System.out.println("Open Database connection");
}
static void closeConnection() {
System.out.println("Close Database connection");
}
}
}
方法引用
方法引用通过方法的名字来指向一个方法.
示例:
public class MethodReference {
public static void main(String[] args) {f
// 方法引用使用一对冒号 :: 来实现
List names = new ArrayList();
names.add("Google");
names.add("Runoob");
names.add("Taobao");
names.add("Baidu");
names.add("Sina");
names.forEach(System.out::println);
}
}
流 Stream
Java 8 API 添加了一个称为流 Stream 的新的抽象,通过使用 Stream 可以提高程序员的生产力,让程序员写出高效、干净、简洁的代码。
流 Stream 将要处理的元素集合看作一种流,流可以在管道中传输,并且可以在管道的节点上进行处理,比如过滤筛选,排序,聚合等。
示例:
public class Stream {
public static void main(String[] args) {
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
System.out.println("列表: " + strings);
long count = strings.stream().filter(string -> string.isEmpty()).count();
System.out.println("空字符串数量为: " + count);
count = strings.stream().filter(string -> string.length() == 3).count();
System.out.println("字符串长度为 3 的数量为: " + count);
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
System.out.println("筛选后的列表: " + filtered);
String collect = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(","));
System.out.println("合并字符串:" + collect);
//*********************//
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
List<Integer> integers = Arrays.asList(1, 2, 13, 4, 15, 6, 17, 8, 19);
List<Integer> squaresList = numbers.stream().map(i -> i * i).distinct().collect(Collectors.toList());
System.out.println("Squares List: " + squaresList);
System.out.println("列表: " + integers);
IntSummaryStatistics stats = integers.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println("列表中最大的数 : " + stats.getMax());
System.out.println("列表中最小的数 : " + stats.getMin());
System.out.println("所有数之和 : " + stats.getSum());
System.out.println("平均数 : " + stats.getAverage());
System.out.println("随机数: ");
// 输出10个随机数
Random random = new Random();
for (int i = 0; i < 10; i++) {
System.out.println(random.nextInt());
}
random.ints().limit(10).sorted().forEach(System.out::println);
// 并行处理
count = strings.parallelStream().filter(string -> string.isEmpty()).count();
System.out.println("空字符串的数量为: " + count);
}
}
Java 9
Java 9 中最值得关注的就是引入了模块系统,还有其他一些特性如下。
模块系统
Java 9 引入了模块系统,并且将 JDK 也进行了模块化。在以前,不管我们做什么项目(有可能就是很小的一个demo项目)都需要包含 JDK 中所有的包,这样会导致程序包非常大。将 JDK 模块化后,当用到某些模块时,之引入具体的模块,这样会大大减小程序包。
JDK 9 中一共由 94 个模块组成,通过新增的 jlink
工具可以创建出每个应用独有的 Java 运行时镜像。
交互式工具jshell
Java 9 增加了新特性 jshell
,在 jshell 中可以直接输入表达式并查看执行结果。
当我们需要测试一个方法的运行效果,或是快速的对表达式进行求值时,jshell 都非常实用。
.of() 创建不可变集合
在集合中, java 9 增加了 List.of()、Set.of()、Map.of() 等工厂方法来创建不可变集合。在这之前,如果我们需要创建不可变集合,需要借助 Collections.unmodifiableSet() 等方法来实现。
接口支持私有方法
在 Java 8 中,接口引入了新的支持 一一 默认方法和静态方法。
在 Java 9 中,接口又引入了对私有方法的支持。
示例:
interface logging {
String ORACLE = "Oracle_Database";
String MYSQL = "Mysql_Database";
private void log(String message, String prefix) {
getConnection();
System.out.println("Log Message : " + prefix);
closeConnection();
}
default void logInfo(String message) {
log(message, "INFO");
}
static void getConnection() {
System.out.println("Open Database connection");
}
static void closeConnection() {
System.out.println("Close Database connection");
}
}
更好的 Try-with-resource 体验
Java 7 引入了 Try-with-resource,使得我们可以更方便地对资源进行关闭,但是我们必须得对资源对象进行声明。
Java 9 中去除了这一限制,使得对资源的管理更加方便。
示例:
private static String beforeJava9(String message) throws IOException {
Reader inputString = new StringReader(message);
BufferedReader br = new BufferedReader(inputString);
try (BufferedReader br1 = br) {
return br1.readLine();
}
}
private static String Java9(String message) throws IOException {
Reader inputString = new StringReader(message);
BufferedReader br = new BufferedReader(inputString);
try (br) {
return br.readLine();
}
}
Java 10
局部变量类型推断 var
Java 10 中我觉得最值得说的就属局部变量类型推断 var 了,它能够帮助我们更加快速地编写简洁的代码。但是使用 var 使得我们不容易分辨变量的类型,利弊各有吧。
示例:
public class LocalVariableTypeInference {
public static void main(String[] args) {
var list = new ArrayList<String>();
list.add("2");
System.out.println(list.toString());
var stream = list.stream();
System.out.println(stream.toString());
}
}
Java 11
var 支持 Lambda
Java 10 虽然引入了 var 保留字,但是其不能在 Lambda 中声明使用,在 Java 11 中克服了这一弊端。
示例:
// (var x, var y) -> x.process(y)
// 等价于
// (x, y) -> x.process(y)
标准化的 HTTP Client API
Java 11 中将 HttpClient 变成了原生的,在这之前,我们使用 HttpClient时,需要引入 apache 的包。
Java 各个版本中的新特性的更多相关文章
- CAP 2.5 版本中的新特性
前言 首先,恭喜 CAP 已经成为 eShopOnContainers 官方推荐的生产环境可用的 EventBus 之一. 自从上次 CAP 2.4 版本发布 以来,已经过去了几个月的时间,关注的朋友 ...
- 使用示例带你提前了解 Java 9 中的新特性
使用示例带你提前了解 Java 9 中的新特性 转载来源:https://juejin.im/post/58c5e402128fe100603cc194 英文出处:https://www.journa ...
- Java高新技术 JDK1.5之新特性
Java高新技术 JDK1.5的新特性 知识概要: (1)静态导入 (2)可变参数 (3)增强for循环 (4)基本数据类型的自动拆箱和装箱 静态导入 ...
- Java9发布回顾Java 8的十大新特性
java9已经在北京时间9月22日正式发布,开发者可以在oracle jdk官网上下载到最新的jdk9. 今天,我们先来一起复习一下2014年发布的Java 8的十大新特性.先来喝杯java~~~ 按 ...
- JDK各版本内容和新特性
JDK各版本内容和新特性 - yanlzhl - 博客园 https://www.cnblogs.com/yanlzhl/articles/5694470.html 版本JDK1.0:1995年 ...
- 1 PHP 5.3中的新特性
1 PHP 5.3中的新特性 1.1 支持命名空间 (Namespace) 毫无疑问,命名空间是PHP5.3所带来的最重要的新特性. 在PHP5.3中,则只需要指定不同的命名空间即可,命名空间的分隔符 ...
- Atitit js版本es5 es6新特性
Atitit js版本es5 es6新特性 Es5( es5 其实就是adobe action script的标准化)1 es6新特性1 Es5( es5 其实就是adobe action scrip ...
- ASP.NET 5与MVC 6中的新特性
差点忘了提一句,MVC 6中默认的渲染引擎Razor也将得到更新,以支持C# 6中的新语法.而Razor中的新特性还不只这一点. 在某些情况下,直接在Web页面中嵌入某些JSON数据的方式可能比向服务 ...
- Webpack 3 中的新特性
本文简短地分享下最新发布的 Webpack 3 中的新特性,供大家参考. 1. Webpack 3 的新特性 6 月 20 日,Webpack 发布了最新的 3.0 版本,并在 Medium 发布了公 ...
随机推荐
- 【密码学】CBC反转字节攻击
前言 暑假刷安全牛的课,看视频有点够了,想做点题,选择了实验吧,结果上来就整懵了 web题,牵扯到了CBC反转字节攻击,密码学!? 查阅资料,学习一下 CBC加解密 CBC 模式中会先将明文分组与前一 ...
- 2. Go中defer使用注意事项
1. 简介 defer 会在当前函数返回前执行传入的函数,它会经常被用于关闭文件描述符.关闭数据库连接以及解锁资源. 理解这句话主要在三个方面: 当前函数 返回前执行,当然函数可能没有返回值 传入的函 ...
- Python基础入门(7)- Python异常处理机制
1.初识异常 1.1.什么是异常与异常处理 异常就是错误 异常会导致程序崩溃并停止运行 能监控并捕获异常,将异常部位的程序进行修理使得程序继续正常运行 1.2.异常的语法 1 # coding:utf ...
- CF1445A Array Rearrangement 题解
Content 有 \(t\) 组询问,每组询问给定两个长度为 \(n\) 的数列 \(\{a_i\}_{i=1}^n,\{b_i\}_{i=1}^n\) 和一个整数 \(x\),求是否能够重新对两个 ...
- java 多线程: Thread 锁ReentrantLock 常用方法
注意 reentrantLock 和 同步代码块儿一样,同一个时刻只能一个线程获取锁,也就是共用锁的代码块部分,线程是顺序执行的 ReentrantLock 常用方法 getHoldCount获取当前 ...
- 以太网/ IPV4/IPV6包头,TCP包头格式回顾
问题:以太网数据包,承载的数据内容大小46~1500字节,是如何来的? 以太网数据包结构 以太网协议规定最小链路层数据包(帧)为64字节,其中以太网首部+尾部共计18字节(源/目的MAC12字节:上 ...
- mail如何在linux中发送邮件,使用163邮箱发信。
如何在linux中发送邮件,使用163邮箱发信. linux中,可以使用mail命令往外发送邮件,在使用前,只需要指定如下简单配置即可,这里演示用 163.com 邮箱发送至 qq.com ...
- UiPath RPA培训2021.4版本解读 (2021年5月)-RPA学习天地
2021年5月26日Ui Path发布了新产品2021.4版本,我们来看看有什么新功能: 说明一下uipath的版本发布节奏: uipath的版本一般是每年发布2个版本,其中5月份发布的一般是FTS版 ...
- html5调用摄像头截图
关于html5调用音视频等多媒体硬件的API已经很成熟,不过一直找不到机会把这些硬件转化为实际的应用场景,不过近年来随着iot和AI的浪潮,我觉得软硬结合的时机已经成熟.那我们就提前熟悉下怎么操作这些 ...
- Ubuntu Server服务器上架设Git Server服务器
1.设置公钥 ubuntu:/home/git$ ssh-keygen -t rsa #生成密钥 这里会提示输入密码,我们不输入直接回车即可. 然后用刚生成公钥/home/git/.ssh/id_rs ...