摘要:\u002F\u002F 3\u003Cbr\u003E\u003C\u002Fpre\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E三、集合加强\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E自 Java 9 开始,Jdk 里面为集合(List\u002F Set\u002F Map)都添加了 of 和 copyOf 方法,它们两个都用来创建不可变的集合,来看下它们的使用和区别。\u002F\u002F javastack\u003Cbr\u003E\u003C\u002Fpre\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E六、InputStream 加强\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003EInputStream 终于有了一个非常有用的方法:transferTo,可以用来将数据直接传输到 OutputStream,这是在处理原始数据流时非常常见的一种用法,如下示例。

"\u003Cdiv\u003E\u003Cp class=\"ql-align-justify\"\u003E美国时间 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 都有哪些重要的新特性呢?\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E一、本地变量类型推断\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E什么是局部变量类型推断?\u003C\u002Fp\u003E\u003Cpre class=\"ql-align-justify\"\u003Evar javastack = \"javastack\";\u003Cbr\u003ESystem.out.println(javastack);\u003Cbr\u003E\u003C\u002Fpre\u003E\u003Cp class=\"ql-align-justify\"\u003E大家看出来了,局部变量类型推断就是左边的类型直接使用 var 定义,而不用写具体的类型,编译器能根据右边的表达式自动推断类型,如上面的 String 。\u003C\u002Fp\u003E\u003Cpre class=\"ql-align-justify\"\u003Evar javastack = \"javastack\";\u003Cbr\u003E\u003C\u002Fpre\u003E\u003Cp class=\"ql-align-justify\"\u003E就等于:\u003C\u002Fp\u003E\u003Cpre class=\"ql-align-justify\"\u003EString javastack = \"javastack\";\u003Cbr\u003E\u003C\u002Fpre\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E二、字符串加强\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003EJava 11 增加了一系列的字符串处理方法,如以下所示。\u003C\u002Fp\u003E\u003Cpre class=\"ql-align-justify\"\u003E\u002F\u002F 判断字符串是否为空白\u003Cbr\u003E \" \".isBlank(); \u002F\u002F true\u003Cbr\u003E \u003Cbr\u003E \u002F\u002F 去除首尾空格\u003Cbr\u003E \" Javastack \".strip(); \u002F\u002F \"Javastack\"\u003Cbr\u003E \u003Cbr\u003E \u002F\u002F 去除尾部空格 \u003Cbr\u003E \" Javastack \".stripTrailing(); \u002F\u002F \" Javastack\"\u003Cbr\u003E \u003Cbr\u003E \u002F\u002F 去除首部空格 \u003Cbr\u003E \" Javastack \".stripLeading(); \u002F\u002F \"Javastack \"\u003Cbr\u003E \u003Cbr\u003E \u002F\u002F 复制字符串\u003Cbr\u003E \"Java\".repeat(3); \u002F\u002F \"JavaJavaJava\"\u003Cbr\u003E \u003Cbr\u003E \u002F\u002F 行数统计\u003Cbr\u003E \"A\\nB\\nC\".lines().count(); \u002F\u002F 3\u003Cbr\u003E\u003C\u002Fpre\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E三、集合加强\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E自 Java 9 开始,Jdk 里面为集合(List\u002F Set\u002F Map)都添加了 of 和 copyOf 方法,它们两个都用来创建不可变的集合,来看下它们的使用和区别。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E示例1:\u003C\u002Fp\u003E\u003Cpre class=\"ql-align-justify\"\u003Evar list = List.of(\"Java\", \"Python\", \"C\");\u003Cbr\u003E var copy = List.copyOf(list);\u003Cbr\u003ESystem.out.println(list == copy); \u002F\u002F true\u003Cbr\u003E\u003C\u002Fpre\u003E\u003Cp class=\"ql-align-justify\"\u003E示例2:\u003C\u002Fp\u003E\u003Cpre class=\"ql-align-justify\"\u003Evar list = new ArrayList<String>();\u003Cbr\u003E var copy = List.copyOf(list);\u003Cbr\u003ESystem.out.println(list == copy); \u002F\u002F false\u003Cbr\u003E\u003C\u002Fpre\u003E\u003Cp class=\"ql-align-justify\"\u003E示例1和2代码差不多,为什么一个为true,一个为false?来看下它们的源码:\u003C\u002Fp\u003E\u003Cpre class=\"ql-align-justify\"\u003Estatic <E> List<E> of(E... elements) {\u003Cbr\u003E switch (elements.length) { \u002F\u002F implicit null check of elements\u003Cbr\u003E case 0:\u003Cbr\u003E return ImmutableCollections.emptyList();\u003Cbr\u003E case 1:\u003Cbr\u003E return new ImmutableCollections.List12<>(elements[0]);\u003Cbr\u003E case 2:\u003Cbr\u003E return new ImmutableCollections.List12<>(elements[0], elements[1]);\u003Cbr\u003E default:\u003Cbr\u003E return new ImmutableCollections.ListN<>(elements);\u003Cbr\u003E }\u003Cbr\u003E }\u003Cbr\u003E \u003Cbr\u003E static <E> List<E> copyOf(Collection<? extends E> coll) {\u003Cbr\u003E return ImmutableCollections.listCopy(coll);\u003Cbr\u003E }\u003Cbr\u003E \u003Cbr\u003E static <E> List<E> listCopy(Collection<? extends E> coll) {\u003Cbr\u003E if (coll instanceof AbstractImmutableList && coll.getClass() != SubList.class) {\u003Cbr\u003E return (List<E>)coll;\u003Cbr\u003E } else {\u003Cbr\u003E return (List<E>)List.of(coll.toArray());\u003Cbr\u003E }\u003Cbr\u003E}\u003Cbr\u003E\u003C\u002Fpre\u003E\u003Cp class=\"ql-align-justify\"\u003E可以看出 copyOf 方法会先判断来源集合是不是 AbstractImmutableList 类型的,如果是,就直接返回,如果不是,则调用 of 创建一个新的集合。示例2因为用的 new 创建的集合,不属于不可变 AbstractImmutableList 类的子类,所以 copyOf 方法又创建了一个新的实例,所以为false。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E注意\u003C\u002Fstrong\u003E:使用 of 和 copyOf 创建的集合为不可变集合,不能进行添加、删除、替换、排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E上面演示了 List 的 of 和 copyOf 方法,Set 和 Map 接口都有。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E四、Stream 加强\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003EStream 是 Java 8 中的新特性,Java 9 开始对 Stream 增加了以下 4 个新方法。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E1. 增加单个参数构造方法,可为null\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003EStream.ofNullable(null).count(); \u002F\u002F 0\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E2. 增加 takeWhile 和 dropWhile 方法\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003EStream.of(1, 2, 3, 2, 1)\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E.takeWhile(n -> n < 3)\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E.collect(Collectors.toList()); \u002F\u002F [1, 2]\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E从开始计算,当 n < 3 时就截止。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003EStream.of(1, 2, 3, 2, 1)\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E.dropWhile(n -> n < 3)\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E.collect(Collectors.toList()); \u002F\u002F [3, 2, 1]\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E这个和上面的相反,一旦 n < 3 不成立就开始计算。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E3. iterate重载\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E这个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。如果你对 JDK 8 中的 Stream 还不熟悉,可以自行百度下教程。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E五、Optional 加强\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003EOpthonal 也增加了几个非常酷的方法,现在可以很方便的将一个 Optional 转换成一个 Stream, 或者当一个空 Optional 时给它一个替代的。\u003C\u002Fp\u003E\u003Cpre class=\"ql-align-justify\"\u003EOptional.of(\"javastack\").orElseThrow(); \u002F\u002F javastack\u003Cbr\u003E Optional.of(\"javastack\").stream().count(); \u002F\u002F 1\u003Cbr\u003E Optional.ofNullable(null)\u003Cbr\u003E .or(() -> Optional.of(\"javastack\"))\u003Cbr\u003E .get(); \u002F\u002F javastack\u003Cbr\u003E\u003C\u002Fpre\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E六、InputStream 加强\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003EInputStream 终于有了一个非常有用的方法:transferTo,可以用来将数据直接传输到 OutputStream,这是在处理原始数据流时非常常见的一种用法,如下示例。\u003C\u002Fp\u003E\u003Cpre class=\"ql-align-justify\"\u003Evar classLoader = ClassLoader.getSystemClassLoader();\u003Cbr\u003E var inputStream = classLoader.getResourceAsStream(\"javastack.txt\");\u003Cbr\u003E var javastack = File.createTempFile(\"javastack2\", \"txt\");\u003Cbr\u003E try (var outputStream = new FileOutputStream(javastack)) {\u003Cbr\u003E inputStream.transferTo(outputStream);\u003Cbr\u003E}\u003Cbr\u003E\u003C\u002Fpre\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E七、HTTP Client API\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E这是 Java 9 开始引入的一个处理 HTTP 请求的的孵化 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在 java.net 包中找到这个 API。来看一下 HTTP Client 的用法:\u003C\u002Fp\u003E\u003Cpre class=\"ql-align-justify\"\u003Evar request = HttpRequest.newBuilder()\u003Cbr\u003E .uri(URI.create(\"https:\u002F\u002Fjavastack.cn\"))\u003Cbr\u003E .GET()\u003Cbr\u003E .build();\u003Cbr\u003E var client = HttpClient.newHttpClient();\u003Cbr\u003E \u003Cbr\u003E \u002F\u002F 同步\u003Cbr\u003E HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());\u003Cbr\u003E System.out.println(response.body());\u003Cbr\u003E \u003Cbr\u003E \u002F\u002F 异步\u003Cbr\u003E client.sendAsync(request, HttpResponse.BodyHandlers.ofString())\u003Cbr\u003E .thenApply(HttpResponse::body)\u003Cbr\u003E\u003C\u002Fpre\u003E\u003Cp class=\"ql-align-justify\"\u003E上面的 .GET() 可以省略,默认请求方式为 Get!现在 Java 自带了这个 HTTP Client API,我们以后还有必要用 Apache 的 HttpClient 工具包吗?\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E\u003Cstrong\u003E八、化繁为简,一个命令编译运行源代码\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E看下面的代码:\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E\u002F\u002F 编译\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E javac Javastack.java\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E \u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E \u002F\u002F 运行\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003Ejava Javastack\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E在我们的认知里面,要运行一个 Java 源代码必须先编译,再运行,两步执行动作。而在未来的 Java 11 版本中,通过一个 java 命令就直接搞定了,如以下所示。\u003C\u002Fp\u003E\u003Cp class=\"ql-align-justify\"\u003E本文转载自csdn-代码风\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003EMyEclipse 最新动态尽在MyEclipse官方中文网!\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003Ehttps:\u002F\u002Fwww.myeclipsecn.com\u002F\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E点击“了解更多”获取最新试用版!\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E"'.slice(6, -6), groupId: '6719656856689574407
相关文章