MyEclipse CI 2019.4.0安装包下载

美国时间 09 月 25 日,Oralce正式发布了Java 11,这是据Java 8以后支持的首个长期版本。从官方发布的支持路线图表看出,Java 8 扩展支持到 2025 年,而 Java 11 扩展支持到 2026 年。现在大部分都在用 Java 8,Java 9 和 10 目前很少有人在用,现在 Java 11 长期支持,也已经包含了 9 和 10 的全部功能。那么我们一起来看下从 Java 9 - 11 都有哪些重要的新特性呢?

一、本地变量类型推断

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

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

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

var javastack = "javastack";

就等于:

String javastack = "javastack";

二、字符串加强

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

// 判断字符串是否为空白

  " ".isBlank(); // true
     // 去除首尾空格   " Javastack ".strip(); // "Javastack"
     // 去除尾部空格    " Javastack ".stripTrailing(); // " Javastack"
     // 去除首部空格    " Javastack ".stripLeading(); // "Javastack "
     // 复制字符串   "Java".repeat(3); // "JavaJavaJava"
     // 行数统计   "A\nB\nC".lines().count(); // 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 接口都有。

四、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 (判断条件)来指定什么时候结束迭代。如果你对 JDK 8 中的 Stream 还不熟悉,可以自行百度下教程。

五、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

六、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);
}

七、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<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());   System.out.println(response.body());
     // 异步   client.sendAsync(request, HttpResponse.BodyHandlers.ofString())       .thenApply(HttpResponse::body)

上面的 .GET() 可以省略,默认请求方式为 Get!现在 Java 自带了这个 HTTP Client API,我们以后还有必要用 Apache 的 HttpClient 工具包吗?

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

看下面的代码:

// 编译
 javac Javastack.java
 
 // 运行
java Javastack

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

本文转载自csdn-代码风

MyEclipse 最新动态尽在MyEclipse官方中文网!

Java 11必掌握的8大特性,完美代码信手拈来的更多相关文章

  1. Java 11 这 8 个逆天新特性教你写出更牛逼的代码!

    美国时间2018年 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本. 为什么说是长期版本,看下面的官方发布的支持路线图表. 可以看出 Jav ...

  2. jdk8十大特性并代码demo(转)

    一.十大特性 1.Lambda表达式 2.Stream函数式操作流元素集合 3.接口新增:默认方法与静态方法 4.方法引用,与Lambda表达式联合使用 5.引入重复注解 6.类型注解 7.最新的Da ...

  3. 一线大厂Java面试必问的2大类Tomcat调优

    一.前言 最近整理了 Tomcat 调优这块,基本上面试必问,于是就花了点时间去搜集一下 Tomcat 调优都调了些什么,先记录一下调优手段,更多详细的原理和实现以后用到时候再来补充记录,下面就来介绍 ...

  4. 【整理】Java 11新特性总结

    闲语 2018年9月25日,Java 11正式发布,与JDK 10不同,JDK 11将提供长期支持,还将作为Java平台的参考实现以及标准版(Java SE)11.Oracle直到2023年9月都会为 ...

  5. Java 11正式发布,这几个逆天新特性教你写出更牛逼的代码

    就在前段时间,Oracle 官方宣布 Java 11 (18.9 LTS) 正式发布,可在生产环境中使用! 这无疑对我们来说是一大好的消息.作为一名java开发者来说,虽然又要去学习和了解java11 ...

  6. Java 11 新特性介绍

    Java 11 已于 2018 年 9 月 25 日正式发布,之前在Java 10 新特性介绍中介绍过,为了加快的版本迭代.跟进社区反馈,Java 的版本发布周期调整为每六个月一次——即每半年发布一个 ...

  7. java的3大特性

    java的3大特性 1.继承: * 继承是从已有类得到继承信息创建新类的过程. * 提供继承信息的类被称为父类(超类.基类):得到继承信息的类被称为子类(派生类). * 继承让变化中的软件系统有定的延 ...

  8. Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码

    美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本. 为什么说是长期版本,看下面的官方发布的支持路线图表. 可以看出 Java 8 扩 ...

  9. 程序员必知的8大排序(四)-------归并排序,基数排序(java实现)

    程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现) 程序员必知的8大排序(三)-------冒 ...

随机推荐

  1. ping命令介绍

    1.ping是TCP/IP协议的一部分,所以只要安装了TCP/IP协议就(无论windows或linux)都可以使用ping命令. 2.ping命令的原理:本机创建一个数据包发送给(ping对象)目标 ...

  2. 阶段3 2.Spring_09.JdbcTemplate的基本使用_6 JdbcDaoSupport的使用以及Dao的两种编写方式

    复制三个出来.分别叫做 OrderDaoImpl.ProductDaoImpl.UserDaoImpl 复制这三个出来就是为了解决重复性代码的问题. 每个dao中都有这段代码.这些都是重复性的代码.在 ...

  3. ubuntu 常用命令及一些问题collection

    转载请包含http://www.cnblogs.com/lqruui/p/5306941.html 一.安装卸载删除 1.手动 install.卸载.删除 1.首先tar -zxvf +压缩包名解压压 ...

  4. QA Issue: PN: startUp is upper case, this can result in unexpected behavior. [uppercase-pn]

    (借用一下) 该错误直接导致生成开机启动程序无法启动,既无法生成S99***快捷链接. 解决方法:仅仅将recpie lib-Test改成lib-test就可以了,即不要有大写字母. 附启动方法: S ...

  5. windows中eclipse连接虚拟机hdfs

    1.修改配置文件core-site.xml,将其中localhost改为虚拟机的ip地址: 在Ubuntu中,打开控制台,使用命令ifconfig查看虚拟机ip,如图: 修改[hadoop安装路径]/ ...

  6. 线程间的协作(wait/notify/sleep/yield/join)(五)

    一.线程的状态 Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态). New:新建状态,当线 ...

  7. Spring中pom文件所需节点

    <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> &l ...

  8. IM学习目录

    1. 浅谈即时通讯 https://www.cnblogs.com/shoshana-kong/p/9724963.html 2. im即时通讯  https://www.cnblogs.com/sh ...

  9. c#中抽象类和接口的相同点跟区别

    下面是自己写的一个demo,体现抽象类和接口的用法. using System; using System.Collections.Generic; using System.Linq; using ...

  10. numpy中的快速的元素级数组函数

    numpy中的快速的元素级数组函数 一元(unary)ufunc 对于数组中的每一个元素,都将元素代入函数,将得到的结果放回到原来的位置 >>> import numpy as np ...