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 发布了公 ...
随机推荐
- 判断是否为空….IsEmpty(Power Query 之 M 语言)
公式: 判断表:=Table.IsEmpty( 表) 判断列表:=List.IsEmpty( 列表) 说明: 此公式的参数一般是一个由公式生成的结果 最终效果: 表/列表中全部是空的返回true 表/ ...
- hashlib加密模块主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法,HMAC消息签名(HMAC-SHA1,....)
hashlib模块 用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 MD5 摘要输出 # ...
- SpringBoot整合Elasticsearch启动报错处理 nested exception is java.lang.IllegalStateException: availableProcessors is already set to [8], rejecting [8]
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean wit ...
- std::bind与std::ref, why and how
首先解释下为什么有时候需要bind. 我们可以用bind从函数T add(T a, T b)造出个inc()来,即把b写死为1.这个例子本身比较傻,但有不傻的应用. template<typen ...
- 【LeetCode】858. Mirror Reflection 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【剑指Offer】09. 用两个栈实现队列 解题报告(python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 一个栈用来保存输入,一个栈用来输出 日 ...
- B. Destroying Roads
Destroying Roads 题目链接 题意 n个点,m条边每两个点之间不会有两个相同的边,然后给你两个起s1,s2和终点t1,t2; 求删除最多的边后满足两个s1到t1距离\(<=l1\) ...
- WPF之AvalonEdit实现MVVM双向绑定
AvalonEdit简介 AvalonEdit是基于WPF开发的代码显示控件,默认支持多种不同语言的关键词高亮,并且可以自定义高亮配置.所以通过AvalonEdit可以快速开发出自己想要的代码编辑器. ...
- SROP
先放个例题吧,原理后面有时间再更:BUUCTF ciscn_2019_s_3 保护只开了nx 1 signed __int64 vuln() 2 { 3 signed __int64 v0; // r ...
- 2021前端面试css(三)
overflow 原理 块格式化上下文是css可视化渲染的一部分,它是一块区域,规定了内部块盒的渲染方式,以及浮动相互之间的影响关系,当元素设置了overflow 样式且值不为visible时,元素就 ...