Java 9 功能与示例

2023-11-09

Java 9 是一个主要版本,它为我们开发人员带来了很多功能。在本文中,我们将详细研究 Java 9 功能。

Java 10 已发布,有关 Java 10 版本的完整概述,请访问Java 10 特性.

Java 9 特性

java 9 features Some of the important java 9 features are;

  1. Java 9 REPL(JShell)
  2. 不可变列表、集合、映射和 Map.Entry 的工厂方法
  3. 接口中的私有方法
  4. Java 9 模块系统
  5. 流程 API 改进
  6. 尝试改善资源
  7. CompletableFuture API 改进
  8. 反应式流
  9. 匿名内部类的钻石运算符
  10. 可选的类改进
  11. 流 API 改进
  12. 增强的@Deprecated注释
  13. HTTP 2 客户端
  14. 多分辨率图像API
  15. 其他 Java 9 功能

Oracle 公司将于 2017 年 3 月底左右发布 Java SE 9。在这篇文章中,我将通过一些示例简要讨论“Java 9 功能”。

Java 9 REPL(JShell)

Oracle 公司推出了一款名为“jshell”的新工具。它代表 Java Shell,也称为 REPL(读取评估打印循环)。它用于非常轻松地执行和测试任何 Java 结构,如类、接口、枚举、对象、语句等。我们可以从以下位置下载 JDK 9 EA(早期访问)软件:https://jdk9.java.net/download/

G:\>jshell
|  Welcome to JShell -- Version 9-ea
|  For an introduction type: /help intro


jshell> int a = 10
a ==> 10

jshell> System.out.println("a value = " + a )
a value = 10

如果您想了解更多有关 REPL 工具的信息,请查看Java 9 REPL 基础知识(第 1 部分) and Java 9 REPL 功能(第 2 部分).

不可变列表、集合、映射和 Map.Entry 的工厂方法

Oracle 公司引入了一些方便的工厂方法来创建 Immutable List、Set、Map 和 Map.Entry 对象。这些实用方法用于创建空或非空 Collection 对象。在 Java SE 8 及更早版本中,我们可以使用 Collections 类实用方法,例如unmodifiableXXX创建不可变集合对象。例如,如果我们想创建一个不可变列表,那么我们可以使用Collections.unmodifiableList方法。然而,这些Collections.unmodifiableXXX方法是一种乏味且冗长的方法。为了克服这些缺点,Oracle 公司在 List、Set 和 Map 接口中添加了一些实用方法。 List 和 Set 接口具有“of()”方法来创建空或非空的 Immutable List 或 Set 对象,如下所示:空列表示例

List immutableList = List.of();

非空列表示例

List immutableList = List.of("one","two","three");

Map 有两组方法:of()方法和ofEntries()分别创建 Immutable Map 对象和 Immutable Map.Entry 对象的方法。空地图示例

jshell> Map emptyImmutableMap = Map.of()
emptyImmutableMap ==> {}

非空映射示例

jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}

如果您想了解有关这些实用方法的更多信息,请访问以下链接:

  • Java 9 不可变列表的工厂方法
  • Java 9 不可变集的工厂方法
  • 用于不可变 Map 和 Map.Entry 的 Java 9 工厂方法

接口中的私有方法

在Java 8中,我们可以使用默认方法和静态方法在接口中提供方法实现。但是我们不能在接口中创建私有方法。为了避免冗余代码和提高可重用性,Oracle 公司将在 Java SE 9 接口中引入私有方法。从 Java SE 9 开始,我们也可以使用“private”关键字在接口中编写私有和私有静态方法。这些私有方法只是像其他类私有方法一样,它们之间没有区别。

public interface Card{

  private Long createCardID(){
    // Method implementation goes here.
  }

  private static void displayCardDetails(){
    // Method implementation goes here.
  }

}

如果您想了解有关此新功能的更多信息,请访问此链接:Java 9 接口中的私有方法.

Java 9 模块系统

java 9 功能的一大变化是模块系统。甲骨文公司将推出以下功能作为拼图项目.

  • 模块化JDK
  • 模块化 Java 源代码
  • 模块化运行时映像
  • 封装Java内部API
  • Java平台模块系统

在 Java SE 9 版本之前,我们使用 Monolithic Jars 来开发基于 Java 的应用程序。这种架构有很多限制和缺点。为了避免所有这些缺点,Java SE 9 附带了模块系统。 JDK 9 附带 92 个模块(在最终版本中可能会发生变化)。我们可以使用 JDK 模块,也可以创建自己的模块,如下所示:简单模块示例

module com.foo.bar { }

这里我们使用“module”来创建一个简单的模块。每个模块都有名称、相关代码和其他资源。要了解有关此新架构和实践经验的更多详细信息,请在此处浏览我的原始教程:

  • Java 9 模块系统基础知识
  • 使用命令提示符的 Java 9 模块示例
  • 使用 Eclipse IDE 的 Java 9 Hello World 模块示例

流程 API 改进

Java SE 9 对 Process API 进行了一些改进。他们添加了几个新的类和方法来简化操作系统进程的控制和管理。 Process API 中的两个新接口:

  • java.lang.ProcessHandle
  • java.lang.ProcessHandle.Info

流程API示例

 ProcessHandle currentProcess = ProcessHandle.current();
 System.out.println("Current Process Id: = " + currentProcess.getPid());

尝试改善资源

我们知道,Java SE 7 引入了一种新的异常处理结构:Try-With-Resources 来自动管理资源。这一新声明的主要目标是“自动更好的资源管理”。 Java SE 9 将对此语句进行一些改进,以避免更多冗长并提高可读性。Java SE 7 示例

void testARM_Before_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (BufferedReader reader2 = reader1) {
   System.out.println(reader2.readLine());
 }
}

Java 9 示例

void testARM_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (reader1) {
   System.out.println(reader1.readLine());
 }
}

要了解有关此新功能的更多信息,请浏览我的原始教程:Java 9 Try-With-Resources 改进

CompletableFuture API 改进

在 Java SE 9 中,Oracle 公司将改进 CompletableFuture API 以解决 Java SE 8 中出现的一些问题。他们将添加支持一些延迟和超时、一些实用方法和更好的子类化。

Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);

这里delayedExecutor()是一个静态实用方法,用于返回一个新的Executor,该Executor在给定的延迟后将任务提交给默认的executor。

反应式流

如今,响应式编程在开发应用程序中变得非常流行,并获得了一些好处。 Scala、Play、Akka 等框架已经集成了 Reactive Streams 并获得了很多好处。 Oracle Corps 还在 Java SE 9 中引入了新的 Reactive Streams API。Java SE 9 Reactive Streams API 是一个发布/订阅框架,可以使用 Java 语言轻松实现异步、可扩展和并行应用程序。 Java SE 9 引入了以下 API 来在基于 Java 的应用程序中开发响应式流。

  • java.util.concurrent.Flow
  • java.util.concurrent.Flow.Publisher
  • java.util.concurrent.Flow.Subscriber
  • java.util.concurrent.Flow.Processor

阅读更多内容Java 9 反应式流.

匿名内部类的钻石运算符

我们知道,Java SE 7引入了一项新功能:Diamond Operator,以避免冗余代码和冗长,提高可读性。然而,在 Java SE 8 中,Oracle 公司(Java 库开发人员)发现在匿名内部类中使用 Diamond 运算符存在一些限制。他们已经解决了这些问题并将作为 Java 9 的一部分发布。

  public List getEmployee(String empid){
     // Code to get Employee details from Data Store
     return new List(emp){ };
  }

这里我们只使用“List”而不指定类型参数。

可选的类改进

在 Java SE 9 中,Oracle 公司向 java.util.Optional 类添加了一些有用的新方法。在这里,我将通过一些简单的示例来讨论其中一种方法:stream 方法 如果给定的Optional对象中存在一个值,则此stream()方法将返回具有该值的顺序Stream。否则,它返回一个空 Stream。他们添加了“stream()”方法来延迟处理可选对象,如下所示:

Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)

这里Optional.stream()方法用于将Employee对象的Optional流转换为Employee流,以便我们可以在结果代码中延迟处理这个结果。要通过更多示例了解有关此功能的更多信息,并阅读添加到Optional类中的更多新方法,请阅读我的原始教程:Java SE 9:可选类改进

流 API 改进

在 Java SE 9 中,Oracle 公司向 java.util.Stream 接口添加了四个有用的新方法。由于 Stream 是一个接口,所有这些新实现的方法都是默认方法。其中两个非常重要:dropWhile 和 takeWhile 方法如果您熟悉 Scala 语言或任何 Functions 编程语言,您一定会知道这些方法。这些是编写一些函数式代码时非常有用的方法。让我们在这里讨论 takeWhile 实用方法。该 takeWhile() 将谓词作为参数,并返回给定 Stream 值的子集的 Stream,直到该谓词第一次返回 false。如果第一个值不满足该谓词,则它仅返回一个空流。

jshell> Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 5 )
                 .forEach(System.out::println);
1
2
3
4

要了解有关 takeWhile 和 dropWhile 方法以及其他新方法的更多信息,请浏览我的原始教程:Java SE 9:流 API 改进

增强型@已弃用注解

在 Java SE 8 及更早版本中,@已弃用注解只是一个Marker接口,没有任何方法。它用于标记 Java API,即类、字段、方法、接口、构造函数、枚举等。在 Java SE 9 中,Oracle 公司增强了@已弃用注释以提供有关已弃用 API 的更多信息,并提供Tool分析应用程序对已弃用 API 的静态使用情况。他们向这个已弃用的接口添加了两个方法:用于移除 and since来提供此信息。

HTTP 2 客户端

在 Java SE 9 中,Oracle 公司将发布新的 HTTP 2 客户端 API 以支持 HTTP/2 协议和 WebSocket 功能。由于现有或旧版 HTTP 客户端 API 存在许多问题(例如支持 HTTP/1.1 协议,但不支持 HTTP/2 协议和 WebSocket,仅在阻止模式下工作以及存在许多性能问题。),他们正在用新的 HTTP 替换此 HttpURLConnection API客户。他们将在“java.net.http”包下引入新的 HTTP 2 客户端 API。它支持 HTTP/1.1 和 HTTP/2 协议。它支持同步(阻塞模式)和异步模式。它支持使用 WebSocket API 的异步模式。我们可以在以下位置看到这个新 API:https://download.java.net/java/jdk9/docs/api/java/net/http/package-summary.html HTTP 2 客户端示例

jshell> import java.net.http.*

jshell> import static java.net.http.HttpRequest.*

jshell> import static java.net.http.HttpResponse.*

jshell> URI uri = new URI("https://rams4java.blogspot.co.uk/2016/05/java-news.html")
uri ==> https://rams4java.blogspot.co.uk/2016/05/java-news.html

jshell> HttpResponse response = HttpRequest.create(uri).body(noBody()).GET().response()
response ==> java.net.http.HttpResponseImpl@79efed2d

jshell> System.out.println("Response was " + response.body(asString()))

请阅读我的原始教程:Java SE 9:HTTP 2 客户端通过一些有用的示例来了解 HTTP/2 协议和 WebSocket、新 API 的优点和旧 API 的缺点。

多分辨率图像API

在 Java SE 9 中,Oracle 公司将引入新的多分辨率图像 API。此 API 中的重要接口是 MultiResolutionImage 。它在 java.awt.image 包中可用。 MultiResolutionImage 封装了一组具有不同高度和宽度(即不同分辨率)的图像,并允许我们根据需要查询它们。

其他 Java 9 功能

在本节中,我将仅列出一些 Java SE 9 新功能。我并不是说这些是不太重要的功能。它们对于通过一些有用的示例很好地理解它们也很重要且有用。截至目前,我还没有获得有关这些功能的足够信息。这就是为什么我要在这里列出它们以供简要了解。我将一一挑选这些功能,并通过简短的讨论和示例添加到上面的部分中。最后写一个单独的教程。

  • GC(垃圾收集器)改进
  • 堆栈遍历 API
  • 过滤传入的序列化数据
  • 弃用 Applet API
  • 指示字符串连接
  • 增强的方法句柄
  • Java 平台日志记录 API 和服务
  • 紧凑弦乐
  • Nashorn 的解析器 API
  • Javadoc 搜索
  • HTML5 Java文档

我将一一拾取这些 java 9 功能,并用足够的描述和示例来更新它们。这就是关于 Java 9 功能的简要介绍和示例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 9 功能与示例 的相关文章

  • HibernateTemplate 可以与 EntityManager 共存吗?

    我们有一个 spring 3 应用程序 它仍然使用已弃用的HibernateTemplate为了持久性并希望迁移到更现代的 JPAEntityManager 是否可以在迁移过程中并行使用这两个 API 甚至可能在单个事务中同时使用 以便我们
  • 无法禁用 Firestore 中的离线数据

    从我的数据中删除数据后Firestore Database 这需要我的Android app一段时间后才意识到数据已被删除 我认为这是由于自动数据缓存而发生的 我的应用程序与离线使用无关 我想禁用此功能 我已将其添加到我的自定义中Appli
  • 使用 ScriptEngine 从 JavaScript 调用 Java 方法

    我正在使用 ScriptEngine 运行 JavaScript 我希望 JavaScript 脚本能够调用 myFunction 其中 myFunction 是我的给定类中的一个方法 我知道可以将 importPackage 用于标准 J
  • 为 JSP 创建注销链接?

    当用户登录我的应用程序时 他提交一个要通过 Servlet 处理的表单 servlet 为用户创建一个会话 我如何创建一个链接以便用户可以注销 我似乎无法直接链接到 Servlet 如何删除会话并链接回主页 HttpSession sess
  • 在 libgdx 中批处理多维数据集时出现问题

    我正在尝试开发一款游戏 在屏幕上渲染多达 300 个立方体 为每个多维数据集创建新的 modelInstance 时 modelBatch 的性能非常糟糕 据我所知 没有 3d 批处理可以将所有立方体批处理到一次绘制调用 所以我拼命地尝试以
  • Android 服务 START_STICKY START_NOT_STICKY

    我需要让我的服务始终在后台运行 并使用 startService 函数启动我的服务 无论应用程序的状态如何 我都不想重新启动服务 这是我的观察 START STICKY gt 如果应用程序启动 则服务正在重新启动 当应用程序关闭时 服务也会
  • 在 Java 中将字符串复制到文件的开头

    我想将一个字符串写入文件的开头 我该怎么做 我根本不知道如何添加字符串 这就是我到目前为止所做的 public static void prepend String filename String data throws IOExcepti
  • 获取文本文件中行的字节偏移量?

    我有一个文本文件 例如 one two three four five 我需要获取文件中每一行的偏移量 我如何在 Java 中做到这一点 我搜索了一些 I O 库 如 BufferedReader 和 RandomAccessFile 但我
  • Maven 部署:deploy-file 发布所有文件而不是一个

    我正在使用 Maven 构建我的 Java 应用程序Maven 组装插件 https maven apache org plugins maven assembly plugin 创建一个可执行的 jar 因此 目标文件夹包含多个 jar
  • 在 Selenium Grid 中注册 PhantomJS 节点时出错

    我有以下问题 我成功启动了 Selenium Grid hub java jar selenium server standalone 2 53 0 jar role hub 之后我尝试使用以下命令启动 PhantomJS 节点 phant
  • Java TCP Echo 服务器 - 广播

    我有一个简单的回显服务器 我希望当连接的用户向服务器键入任何内容时 所有其他客户端和该客户端都会收到消息 MOD 它现在不会发送给所有客户端 但它应该发送 而且我只是不知道我的代码出了什么问题 所以现在它只会将消息 MOD 发送给发送消息的
  • Runtime.getRuntime().exec(cmd) 挂起

    我正在执行一个命令 该命令返回文件的修订号 文件名 但如果执行命令时出现问题 应用程序就会挂起 我可以做什么来避免这种情况 请在下面找到我的代码 String cmd cmd C si viewhistory fields revision
  • 无法从 PDFA1-a 格式文档中提取图像

    我正在使用以下代码从 PDFA1 a 格式的 pdf 中提取图像 但我无法获取图像 List
  • 具有多个字符串的列表视图

    我正在尝试创建一个包含多个字符串的列表视图 现在我有一个可以实现的功能 while i lt 10 GETS DATA FROM WEBPAGE ETC a DATAFROMWEBPAGE1 b DATAFROMWEBPAGE2 c DAT
  • 在Linux中执行jar文件[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我创建了一个可执行的 Java jar 文件 也就是说 我将 java 程序正确打包到 jar 文件中 包括 META INF MANIFEST 文件
  • Thread.interrupt() 和 Thread.interrupted() 到底是如何工作的? [复制]

    这个问题在这里已经有答案了 从设置线程状态的角度来看 我不清楚这两种方法 Java 文档说 Thread interrupt 设置线程中断状态标志 调用 Thread interrupted 方法给出线程的状态并清除该标志 当这在实际场景中
  • 避免加密和编码的 URL 字符串中的换行符

    我正在尝试实现一个简单的字符串编码器来混淆 URL 字符串的某些部分 以防止它们被用户弄乱 我使用的代码几乎与示例中的相同JCA指南 http docs oracle com javase 6 docs technotes guides s
  • 在地图中的图块上实现鼠标单击事件

    我正在尝试在 JPanel 上实现图像 基本上是地图上的图块 的鼠标单击事件 我只是不知道该怎么做 我有一个扩展 JPanel 的 Main 类 我正在从图块服务器检索图块 并根据特定的缩放级别在 Main 类的 PaintComponen
  • 项目级别的@PowerMockIgnore

    在 Maven 中运行时 我的 powermock 测试用例出现以下错误 java lang LinkageError loader constraint violation loader instance of org powermock
  • Cassandra 会话与集群 有什么可分享的?

    考虑 Cassandra 的 Session 和 Cluster 类 Java 驱动程序 我想知道有什么区别 在 Hibernate 中 每次都会创建一个会话并共享会话工厂 从许多来源我了解到 它被认为是创建一个会话并在多个线程之间共享它

随机推荐

  • 如何在 Debian 9 上安装和使用 Docker

    Docker 是一个容器化平台 允许您快速构建 测试和部署应用程序作为可移植 自给自足的容器 几乎可以在任何地方运行 Docker 是容器技术事实上的标准 它是 DevOps 工程师及其持续集成和交付管道的重要工具 在本教程中 我们将指导您
  • Linux 中的定位命令

    在 Linux 上工作时最常见的操作之一是搜索文件和目录 Linux 系统上有多个命令允许您搜索文件 其中 find 和locate 是最常用的命令 The locate命令是按名称搜索文件和目录的最快 最简单的方法 在这篇文章中 我们将解
  • Linux 中的 Du 命令

    The du命令是 磁盘使用情况 的缩写 报告给定文件或目录使用的估计磁盘空间量 它对于查找占用大量磁盘空间的文件和目录非常有用 如何使用du命令 的一般语法为du命令如下 du OPTIONS FILE 如果给定FILE是一个目录 du将
  • 如何在 CentOS 7 上安装和配置 VNC

    在本教程中 我们将引导您完成在 CentOS 7 系统上安装和配置 VNC 服务器的步骤 我们还将向您展示如何通过 SSH 隧道安全地连接到 VNC 服务器 虚拟网络计算 VNC 是一种图形桌面共享系统 允许您使用键盘和鼠标远程控制另一台计
  • 如何在 CentOS 7 上安装 Iptables

    从 CentOS 7 开始 防火墙D取代 iptables 成为默认的防火墙管理工具 FirewallD 是一个完整的防火墙解决方案 可以使用名为firewall cmd 的命令行实用程序进行控制 如果您更熟悉 Iptables 命令行语法
  • 如何用 Java 编写您的第一个程序

    作者选择了免费开源基金接受捐赠作为为捐款而写程序 介绍 Java是一种成熟且设计良好的编程语言 用途广泛 从课堂学习到运行任何规模的商业应用程序 它的独特优势之一是它是跨平台的 一旦创建了 Java 程序 就可以在许多操作系统上运行它 包括
  • 如何在 Ubuntu 12.10 上设置 ownCloud 5

    什么是Red Means 用户需要输入或自定义的行将位于red在本教程中 其余的大部分应该是可复制和粘贴的 关于ownCloud ownCloud 是一种开源数据存储解决方案 类似于 Dropbox 或 Google Drive 人们可以获
  • Android RecyclerView 示例 - 多种 ViewType

    到目前为止 我们已经在一个视图中显示了相同类型的视图回收视图 在本教程中 我们将在 RecyclerView 中实现异构布局 回收视图 具有异构布局的 RecyclerView 通常用于显示节标题和详细信息 两者都需要不同的布局 因此需要不
  • 如何在 Ubuntu 18.04 上安装 Node.js

    介绍 Node js是一个用于通用编程的JavaScript平台 允许用户快速构建网络应用程序 通过在前端和后端利用 JavaScript Node js 使开发更加一致和集成 在本指南中 您将了解在 Ubuntu 18 04 服务器上安装
  • 如何在 CentOS 7 上安装 WordPress

    介绍 WordPress 是一个使用 PHP 和 MySQL 的免费开源网站和博客工具 WordPress 是目前互联网上最流行的 CMS 内容管理系统 拥有超过 20 000 个插件来扩展其功能 这使得 WordPress 成为快速轻松地
  • Java二维码生成器-zxing示例

    今天我们将研究Java QR 码生成器程序 如果您精通技术和小工具 那么您一定知道二维码 如今 您随处都可以找到它 在博客 网站 甚至在一些公共场所 这在移动应用程序中非常流行 您可以使用 QR 码扫描仪应用程序扫描 QR 码 它会显示文本
  • Python 位运算符

    Python 按位运算符用于对整数执行按位计算 将整数转换为二进制格式 然后逐位执行运算 因此称为按位运算符 Python 按位运算符仅适用于整数 最终输出以十进制格式返回 Python 按位运算符也称为二元运算符 Python 位运算符
  • 如何在 Ubuntu 14.04 上使用 UFW 设置防火墙

    介绍 UFW 即简单防火墙 是一个接口iptables旨在简化配置防火墙的过程 尽管iptables虽然是一个可靠且灵活的工具 但对于初学者来说 学习如何使用它来正确配置防火墙可能会很困难 如果您希望开始保护您的网络 并且不确定使用哪个工具
  • 如何在 Ubuntu 14.04 上将 MySQL 或 MariaDB 与 Django 应用程序一起使用

    介绍 Django 是一个用于快速创建 Python 应用程序的灵活框架 默认情况下 Django 应用程序配置为将数据存储到轻量级 SQLite 数据库文件中 虽然这在某些负载下效果很好 但更传统的 DBMS 可以提高生产性能 在本指南中
  • Spring MVC @RequestMapping 注解示例,包含控制器、方法、标头、参数、@RequestParam、@PathVariable

    RequestMapping is one of the most widely used Spring MVC annotation org springframework web bind annotation RequestMappi
  • Java 中的 SQL 注入以及如何轻松预防

    什么是 SQL 注入 SQL注入是十大 Web 应用程序漏洞之一 简单来说 SQL注入是指通过用户输入的数据在查询中注入 插入SQL代码 它可以发生在任何使用关系数据库 如 Oracle MySQL PostgreSQL 和 SQL Ser
  • 如何在 Ubuntu 上使用 Stunnel 设置 SSL 隧道

    Status 已弃用 本文已弃用 不再维护 Reason Ubuntu 12 04 已于 2017 年 4 月 28 日终止生命周期 EOL 并且不再接收安全补丁或更新 请参阅 本文作为参考可能仍然有用 但可能不遵循最佳实践或适用于此版本或
  • 如何在 Ubuntu 14.04 LTS 上设置 Apache 虚拟主机

    介绍 Apache Web 服务器是在互联网上提供 Web 内容的最流行的方式 它占互联网上所有活跃网站的一半以上 并且非常强大和灵活 Apache 将其功能和组件分解为可以独立定制和配置的单独单元 描述单个站点或域的基本单位称为virtu
  • 如何使用多站点设置多个 WordPress 站点

    关于多个 WordPress 安装 2010 年 WordPress 发布了流行的内容管理平台 3 0 版本 在该版本中包含的众多改进中 WordPress 社区将 WordPress MU 合并到了主要的 WordPress 配置中 自更
  • Java 9 功能与示例

    Java 9 是一个主要版本 它为我们开发人员带来了很多功能 在本文中 我们将详细研究 Java 9 功能 Java 10 已发布 有关 Java 10 版本的完整概述 请访问Java 10 特性 Java 9 特性 Some of the