【Java代码之美】 — Java11新特性解读

1.背景

美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本。非常值得大家的关注,可以通过下面的地址进行下载:

https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html

Java11和Java8一样,是一个长期支持的版本,下面是Sun官方发布的版本支持路线图:

【Java代码之美】 -- Java11新特性解读

可以看出 Java 8 扩展支持到 2025 年,而 Java 11 扩展支持到 2026 年。Java11包含了Java9、Java10的全部功能,下面我们来看一看Java9与Java11都有哪些重要的功能呢?

2.特性简介

2.1.本地变量类型推断

什么是局部变量类型推断?

var javastack = "javastack";
System.out.println(javastack);

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

var javastack = "javastack";

等价于:

String javastack = "javastack";

2.2.字符串加强

Java 11 增加了一系列的字符串处理方法,如以下所示。

// 判断字符串是否为空白
" ".isBlank();        // true

// 去除首尾空格
" Javastack ".strip();     // "Javastack"

// 去除尾部空格
" Javastack ".stripTrailing(); // " Javastack"

// 去除首部空格
" Javastack ".stripLeading();  // "Javastack "

// 复制字符串
"Java".repeat(3);       // "JavaJavaJava"

// 行数统计
"A\nB\nC".lines().count();  // 3

2.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();
var copy = List.copyOf(list);
System.out.println(list == copy);  // false

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

来看下它们的源码:

static  List 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  List copyOf(Collectionextends E> coll) {
  return ImmutableCollections.listCopy(coll);
}

static  List listCopy(Collectionextends E> coll) {
  if (coll instanceof AbstractImmutableList && coll.getClass() != SubList.class) {
    return (List)coll;
  } else {
    return (List)List.of(coll.toArray());
  }
}

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

示例2因为用的 new 创建的集合,不属于不可变 AbstractImmutableList 类的子类,所以 copyOf 方法又创建了一个新的实例,所以为false.

注意:使用 of 和 copyOf 创建的集合为不可变集合,不能进行添加、删除、替换、排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。

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

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

2.4.Stream加强

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

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

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

2) 增加 takeWhile 和 dropWhile 方法

Stream.of(1, 2, 3, 2, 1)
  .takeWhile(n -> n < 3)
  .collect(Collectors.toList()); // [1, 2]

从开始计算,当 n < 3 时就截止。

Stream.of(1, 2, 3, 2, 1)
  .dropWhile(n -> n < 3)
  .collect(Collectors.toList()); // [3, 2, 1]

这个和上面的相反,一旦 n < 3 不成立就开始计算。

3)iterate重载

这个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。

2.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();  // javastack

2.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);
}

2.7. HTTP Client API

这是 Java 9 开始引入的一个处理 HTTP 请求的的孵化 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在 java.net 包中找到这个 API。

来看一下 HTTP Client 的用法:

var request = HttpRequest.newBuilder()
  .uri(URI.create("https://javastack.cn"))
  .GET()
  .build();
var client = HttpClient.newHttpClient();

// 同步
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

// 异步
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
  .thenApply(HttpResponse::body)
  .thenAccept(System.out::println);

上面的 .GET() 可以省略,默认请求方式为 Get!

更多使用示例可以看这个 API,后续有机会再做演示。

现在 Java 自带了这个 HTTP Client API,我们以后还有必要用 Apache 的 HttpClient 工具包吗?

2.8. 化繁为简,一个命令编译运行源代码

看下面的代码。

// 编译
javac Javastack.java

// 运行
java Javastack

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

java Javastack.java

博文写作参考:

Java11新特性

Original: https://www.cnblogs.com/yif0118/p/15315454.html
Author: 人无名,则可专心练剑
Title: 【Java代码之美】 — Java11新特性解读

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/575939/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • mysql-存储引擎

    1.存储引擎 完整的建表语句:CREATE TABLE dept ( DEPTNO int(2) NOT NULL, DNAME varchar(14) DEFAULT NULL,…

    数据库 2023年5月24日
    076
  • MySQL数据库的创建、删除和备份

    总结MySQL数据库的创建、删除和备份操作 MySQL数据库的创建、删除和备份 数据库的创建 //使用指令创建数据库 CREATE DATABASE yjh_db01; //创建一…

    数据库 2023年6月16日
    076
  • ansible碎碎念

    Using a SSH password instead of a key is not possible because Host Key checking is enabled…

    数据库 2023年6月11日
    063
  • B树-查找

    B树系列文章 1. B树-介绍 2. B树-查找 3. B树-插入 4. B树-删除 查找 假设有一棵3阶B树,如下图所示。 下面说明在该B树中查找 52的过程 首先,从根结点出发…

    数据库 2023年6月14日
    0133
  • Geoserver对发布的数据源进行金字塔切片

    一、建立切片数据源1.1建立工作区 1.2添加数据我这里是老师给的高清卫星地图数据,格式为tif工作区选择之前建立的工作区,浏览那里选择对应的文件 1.3建立切片源的图层这里建立的…

    数据库 2023年6月6日
    085
  • RadonDB MySQL Kubernetes 2.2.0 发布!

    摘要 RadonDB MySQL Kubernetes v2.2.0 于近日发布!该版本开始支持 MySQL 8.0,备份功能优化,并全面提升高可用稳定性。社区同步发起&#8221…

    数据库 2023年5月24日
    095
  • C/C++内存泄漏检测方法

    内存泄漏 检测代码 使用链表记录每个malloc返回的指针,释放时从链表中查找并删除找到对应指针的节点。 最终输出链表,该链表记录了所有没有释放的动态内存。 #include #i…

    数据库 2023年6月14日
    071
  • 自定义 systemd service

    Red Hat Linux 自 7 版本后 采用systemd 形式取代原先 init ,用户可以参考 系统service 创建自己的service ,以便于日常统一管理,系统se…

    数据库 2023年6月15日
    081
  • 2022-8-15 数据库 mysql 第一天

    Mysql数据库 数据库 数据库[根据数据结构组织、存储和管理数据的仓库]。它是有组织的、可共享的、统一管理的大量数据的集合,这些数据长期存储在计算机中。 [En] Databas…

    数据库 2023年5月24日
    052
  • Podman部署及应用

    点击查看代码 什么是podman Podman是一个开源项目,可在大多数Linux平台上使用并开源在GitHub上。Podman是一个无守护进程的容器引擎,用于在Linux系统上开…

    数据库 2023年6月14日
    058
  • 获取单选按钮组的选中值

    1 var radioGroup = new Ext.form.RadioGroup({ 2 width: 130, 3 id: ‘selected’, 4 layout: ‘fo…

    数据库 2023年6月9日
    068
  • 探究MySQL中SQL查询的成本

    成本 什么是成本,即SQL进行查询的花费的时间成本,包含IO成本和CPU成本。 IO成本:即将数据页从硬盘中读取到内存中的读取时间成本。通常1页就是1.0的成本。 CPU成本:即是…

    数据库 2023年5月24日
    098
  • linux系统安装MySQL数据库安装保姆级教程及1045错误和2058问题解决

    使用Mysql的zip压缩包解压版,下载之后需进行一定的配置,才能使用它。下面对Mysql压缩包版的安装方法进行详细的描述,如有疑问或错误,望及时反馈。 首先,mysql的官方下载…

    数据库 2023年6月11日
    078
  • Javaweb08-Ajax项目-分页条件查询 + 增删改

    1、登录 欢迎登录课工场KH96动漫管理系统 用户名: 用户密码: 欢迎登录课工场KH96动漫管理系统 用户名: 用户密码: $(function(){ //使用jQuery的Aj…

    数据库 2023年6月16日
    093
  • 每个开发人员都应该关注的7个优秀的GitHub仓库

    1. FreeCodeCamp 2. Developer Roadmap 3. Awesome 4. Build Your Own X 5. Git Ignore 6. Syste…

    数据库 2023年6月11日
    093
  • MySQL启动过程详解一:启动整体流程

    MySQL启动流程如下: 设置进程名 处理配置文件及启动参数以及部分模块初始化,这包括: 2.1 从配置文件中读取选项,把他们放在 argc 和 argv 已有的参数之前 2.2 …

    数据库 2023年6月9日
    053
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球