Java11新特性

Java 11:
2018年9月26日,Oracle 官方宣布 Java 11 正式发布。这是 Java 大版本周期变化后的第一个长期支持版本(LTS版本,Long-Term-Support,持续支持到2026年9月),非常值得关注。Java11 带来了 ZGC、Http Client 等重要特性,一共包含 17 个 JEP(JDK Enhancement Proposals,JDK 增强提案)。
官方新特性:
在这里插入图片描述
本文针对于读者对关心、也是最实用的八大新特性做出一些讲解:
1,本地变量类型推断

var javatest = "hello java11";
System.out.println(javatest);

大家看出了,局部变量类型推断就是左边的类型直接用var定义,而不用写具体的类型,编译器能根据右边的表达式自动推断类型。

var javatest = "hello java11";
就等于:
String javatest = "hello java11";

2,字符串加强
java11增加了一系列的字符串处理方法,如下所示:

// 判断字符串是否为空白
" ".isBlack(); //true
// 去除首尾空格
" test ".strip(); // "terst"
// 去除尾部空格
" test ".stripTrailing; // " test"
//去除首部空格
" test ".stripLeading; // "test "
//复制字符串
"java".repeat(3); // "javajavajava"
//统计行数
"A\nB\nC".lines().count(); // 3

3,集合加强
自 Java 9 开始,Jdk 里面为集合(List/ Set/ Map)都添加了 of 和 copyOf 方法,它们两个都用来创建不可变的集合,来看下它们的使用和区别。
示例1:

var list = List.of("Java", "Python", "C");
var copy = List.copyOf(list);
System.out.println(list == copy); // true

示例2:

var list = new ArrayList<String>();
var copy = List.copyOf(list);
System.out.println(list == copy); // false

示例1和2代码差不多,为什么一个为true,一个为false?

来看下它们的源码:

static <E> List<E> of(E... elements) {

switch (elements.length) { // implicit null check of elements

case 0:

return ImmutableCollections.emptyList();

case 1:

return new ImmutableCollections.List12<>(elements[0]);

case 2:

return new ImmutableCollections.List12<>(elements[0], elements[1]);

default:

return new ImmutableCollections.ListN<>(elements);

}

}

static <E> List<E> copyOf(Collection<? extends E> coll) {

return ImmutableCollections.listCopy(coll);

}

static <E> List<E> listCopy(Collection<? extends E> coll) {

if (coll instanceof AbstractImmutableList && coll.getClass() != SubList.class) {

return (List<E>)coll;

} else {

return (List<E>)List.of(coll.toArray());

}

}

可以看出 copyOf 方法会先判断来源集合是不是 AbstractImmutableList 类型的,如果是,就直接返回,如果不是,则调用 of 创建一个新的集合。

示例2因为用的 new 创建的集合,不属于不可变 AbstractImmutableList 类的子类,所以 copyOf 方法又创建了一个新的实例,所以为false.
注意:使用of和copyOf创建的集合为不可变集合,不能进行添加、删除、替换、排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。

上面演示了 List 的 of 和 copyOf 方法,Set 和 Map 接口都有。

public static void main(String[] args) {

Set<String> names = Set.of("Fred", "Wilma", "Barney", "Betty");

//JDK11之前我们只能这么写

System.out.println(Arrays.toString(names.toArray(new String[names.size()])));

//JDK11之后 可以直接这么写了

System.out.println(Arrays.toString(names.toArray(size -> new String[size])));

System.out.println(Arrays.toString(names.toArray(String[]::new)));

}

Collection.toArray(IntFunction)

在java.util.Collection接口中添加了一个新的默认方法toArray(IntFunction)。此方法允许将集合的元素传输到新创建的所需运行时类型的数组。

public static void main(String[] args) {

Set<String> names = Set.of("Fred", "Wilma", "Barney", "Betty");

//JDK11之前我们只能这么写

System.out.println(Arrays.toString(names.toArray(new String[names.size()])));

//JDK11之后 可以直接这么写了

System.out.println(Arrays.toString(names.toArray(size -> new String[size])));

System.out.println(Arrays.toString(names.toArray(String[]::new)));

}

4,Stream 加强
Stream 是 Java 8 中的新特性,Java 9 开始对 Stream 增加了以下 4 个新方法。

增加单个参数构造方法,可为null

Stream.ofNullable(null).count(); // 0

//JDK8木有ofNullable方法哦
源码可看看:

/**
* @since 9
*/
public static<T> Stream<T> ofNullable(T t) {
return t == null ? Stream.empty()
: StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}

2)、增加 takeWhile 和 dropWhile 方法
Stream.of(1, 2, 3, 2, 1)
.takeWhile(n -> n < 3)
.collect(Collectors.toList()); // [1, 2]
takeWhile表示从开始计算,当 n < 3 时就截止。
Stream.of(1, 2, 3, 2, 1)
.dropWhile(n -> n < 3)
.collect(Collectors.toList()); // [3, 2, 1]
3),iterate重载
这个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。

public static void main(String[] args) {

// 这构造的是无限流 JDK8开始

Stream.iterate(0, (x) -> x + 1);

// 这构造的是小于10就结束的流 JDK9开始

Stream.iterate(0, x -> x < 10, x -> x + 1);

}

5、Optional 加强
Opthonal 也增加了几个非常酷的方法,现在可以很方便的将一个 Optional 转换成一个 Stream, 或者当一个空 Optional 时给它一个替代的。

Optional.of("javastack").orElseThrow(); // javastack

Optional.of("javastack").stream().count(); // 1

Optional.ofNullable(null)

.or(() -> Optional.of("javastack"))

.get(); // javastac

or方法和stream方法显然都是新增的

6、InputStream 加强
InputStream 终于有了一个非常有用的方法:transferTo,可以用来将数据直接传输到 OutputStream,这是在处理原始数据流时非常常见的一种用法,如下示例。

var classLoader = ClassLoader.getSystemClassLoader();
var inputStream = classLoader.getResourceAsStream("javastack.txt");
var javastack = File.createTempFile("javastack2", "txt");
try (var outputStream = new FileOutputStream(javastack)) {
inputStream.transferTo(outputStream);
}

7、HTTP Client API
在java9及10被标记incubator的模块jdk.incubator.httpclient,在java11被标记为正式,改为java.net.http模块。这是 Java 9 开始引入的一个处理 HTTP 请求的的孵化 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在 java.net 包中找到这个 API。

来看一下 HTTP Client 的用法:
上面的 .GET() 可以省略,默认请求方式为 Get!
更多使用示例可以看这个 API,后续有机会再做演示。
现在 Java 自带了这个 HTTP Client API,我们以后还有必要用 Apache 的 HttpClient 工具包吗?我觉得没啥必要了

8、化繁为简,一个命令编译运行源代码
看下面的代码。
// 编译
javac Javastack.java
// 运行
java Javastack
在我们的认知里面,要运行一个 Java 源代码必须先编译,再运行,两步执行动作。而在未来的 Java 11 版本中,通过一个 java 命令就直接搞定了,如以下所示。

java Javastack.java

移除项
移除了com.sun.awt.AWTUtilities
移除了sun.misc.Unsafe.defineClass,
使用 java.lang.invoke.MethodHandles.Lookup.defineClass来替代
移除了Thread.destroy()以及 Thread.stop(Throwable)方法移除了
sun.nio.ch.disableSystemWideOverlappingFileLockCheck、sun.locale.formatasdefault属性
移除了jdk.snmp模块
移除了javafx,openjdk估计是从java10版本就移除了,oracle jdk10还尚未移除javafx,而java11版本则oracle的jdk版本也移除了javafx
移除了Java Mission Control,从JDK中移除之后,需要自己单独下载
移除了这些Root Certificates :Baltimore Cybertrust Code Signing CA,SECOM ,AOL and Swisscom

废弃项
废弃了Nashorn Java Engine
废弃了-XX+AggressiveOpts选项
-XX:+UnlockCommercialFeatures以及
-XX:+LogCommercialFeatures选项也不- 再需要
废弃了Pack200工具及其API

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值