我的编程空间,编程开发者的网络收藏夹
学习永远不晚

从Java 9 到 Java 17之 Java 11

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

从Java 9 到 Java 17之 Java 11

Java 11是自Java 8以来的又一个LTS版本,是目前全球使用最多的LTS版本之一。今天我们接着在Java 9 到 Java 17系列文章中来认识针对普通开发者的Java 11。

字符串API增强

在Java 11中,针对String的操作进一步得到加强。避免我们在很常见的场景中引入额外的、复杂的API。

isBlank()

用来判断字符串是不是空字符""或者trim()之后(" ")为空字符:

  1. String blankStr = "    "
  2. // true 
  3. boolean trueVal = blankStr.isBlank(); 

lines()

将一个字符串按照行终止符(换行符\n或者回车符\r)进行分割,并将分割为Stream流:

  1.         String newStr = "Hello Java 11 \n felord.cn \r 2021-09-28"
  2.  
  3.         Stream lines = newStr.lines(); 
  4.         lines.forEach(System.out::println); 
  5. //        Hello Java 11 
  6. //        felord.cn 
  7. //        2021-09-28 

strip()

去除字符串前后的“全角和半角”空白字符:

  1. String str = "HELLO\u3000"
  2. // str = 6 
  3. System.out.println("str = " + str.length()); 
  4. // trim = 6 
  5. System.out.println("trim = " + str.trim().length()); 
  6. // strip = 5 
  7. System.out.println("strip = " + str.strip().length()); 

这不由得想起来trim()方法,从上面也看出来了差别,trim()只能去除半角空白符。

strip()方法还有两个变种,stripLeading()用来去除前面的全角半角空白符;stripTrailing()用来去除尾部的全角半角空白符。

repeat(n)

按照给定的次数重复串联字符串的内容:

  1. String str = "HELLO"
  2. // 空字符 
  3. String empty = str.repeat(0); 
  4. // HELLO 
  5. String repeatOne = str.repeat(1); 
  6. // HELLOHELLO 
  7. String repeatTwo = str.repeat(2); 

集合转对应类型的数组

之前想集合转对应的数组很麻烦,要么用迭代;要么用Stream流,现在你可以这样:

  1. List sampleList = Arrays.asList("felord.cn""java 11"); 
  2. // array = {"felord.cn""java 11"}; 
  3. String[] array = sampleList.toArray(String[]::new); 

断言取反

java.util.function.Predicate是我们很常用的断言谓词函数。在以前取反我们得借助于!符号,到了Java 11我们可以借助于其静态方法not来实现,这样语义就更加清晰了:

  1. List sampleList = Arrays.asList("felord.cn""java 11","jack"); 
  2. // [jack] 
  3. List result = sampleList.stream() 
  4.         // 过滤以j开头的字符串 
  5.         .filter(s -> s.startsWith("j")) 
  6.         // 同时不包含11的字符串 
  7.         .filter(Predicate.not(s -> s.contains("11"))) 
  8.         .collect(Collectors.toList()); 

其实Predicate在最初版本还提供了一个取反的默认方法:

  1. default Predicate negate() { 
  2.       return (t) -> !test(t); 
  3.   } 

这个我在往期文章中也使用过它来做组合校验,这两个方法的场景是不一样的。

var可以用于修饰Lambda局部变量

在Java 10中引入的var来进行类型推断。在Java 10中它不能用于修饰Lambda表达式的入参,其实对于一个Lambda表达式来说它入参的类型其实是可以根据上下文推断出来的。拿上面的例子来说,s -> s.startsWith("j")中的s肯定是字符串类型,因此在Java 11中var可以用于修饰Lambda局部变量:

  1. List result = sampleList.stream() 
  2.         // 过滤以j开头的字符串 
  3.         .filter((@NotNull var s) -> s.startsWith("j")) 
  4.         // 同时不包含11的字符串 
  5.         .filter(Predicate.not((@NotNull var s) -> s.contains("11"))) 
  6.         .collect(Collectors.toList()); 

如果我们不声明var就没有办法为输入参数添加@NotNull注解。

文件中读写字符串内容更方便

Java 11中可以更轻松地从文件中读取和写入字符串内容了,我们可以通过Files工具类提供的新的静态方法readString和writeString分别进行读写文件的字符串内容,放在之前老麻烦了,特别是对IO流不熟悉的同学来说。现在简单几行就搞定了:

  1. String dir= "C://yourDir"
  2. // 写入文件 
  3. Path path = Files.writeString(Files.createTempFile(dir, "hello"".txt"), "hello java 11"); 
  4. // 读取文件 
  5. String fileContent = Files.readString(path); 

嵌套类的访问控制规则

在Java 11之前,内部嵌套类访问外部类的私有属性和方法是可行的:

  1. public class Outer { 
  2.     private int outerInt; 
  3.  
  4.      class Inner { 
  5.        public void printOuterField() { 
  6.          System.out.println("Outer field = " + outerInt); 
  7.        } 
  8.     } 

但是如果你通过反射API实现内部类访问外部类的私有属性和方法就会抛出IllegalStateException异常。Java 11 修复了反射不能访问的问题。

JVM 访问规则不允许嵌套类之间进行私有访问。我们能通过常规方式可以访问是因为 JVM 在编译时为我们隐式地创建了桥接方法。Java 11 中引入了两个新的属性:一个叫做 NestMembers 的属性,用于标识其它已知的静态 nest 成员;另外一个是每个 nest 成员都包含的 NestHost 属性,用于标识出它的 nest 宿主类。在编译期就映射了双方的寄宿关系,不再需要桥接了。

HttpClient支持HTTP2

HttpClient到了Java 11后开始支持HTTP2,底层进行了大幅度的优化,并且现在完全支持异步非阻塞。

HttpClient 的包名由 jdk.incubator.http 改为 java.net.http。

其它 

Java 11 中,还有一些其它方面的特性和优化,比如引入了ZGC,支持支持 TLS 1.3 协议,引入了动态调用(invokedynamic)机制,另外原来商业版的JFR也进行了开源集成等等。在年初的Java生态调查数据显示Java 11的用户数量大幅增长,成为了主流版本选择之一。

本文转载自微信公众号「码农小胖哥」,可以通过以下二维码关注。转载本文请联系码农小胖哥公众号。

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

从Java 9 到 Java 17之 Java 11

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

从Java 9 到 Java 17之 Java 11

Java 11是自Java 8以来的又一个LTS版本,是目前全球使用最多的LTS版本之一。今天我们接着在Java 9 到 Java 17系列文章中来认识针对普通开发者的Java 11。

从Java 9 到 Java 17之Java 12

Java 12 引入了新的基于区域的紧凑型数字化格式类CompactNumberFormat,用来对长数字进行简写。通常程序员喜欢把工资区间标为10k-20k,而其它一些行业喜欢10000-20000。

从 Java 9 到 Java 17 之 Java 10

Java 10的性能也明显加强了,支持G1并行垃圾收集。另外引入了即时编译技术(JIT),该技术可以加速java程序的运行速度。另外Java 10对容器集成也进行了优化,JVM会根据容器的配置进行选择CPU核心数量和内存占用。

从Java 9 到 Java 17之Java 13

Java 13在2019年9月发布,这个版本引入的正式可用特性几乎没有,是我认为最无聊的版本之一。所以我们跳过Java 13直接来看Java 14吧。

从 Java 11 迁移到 Java 17 值得吗?

Java17中所做的所有改进都传达了一个信息:是时候切换到这个版本了。过渡承诺语法更简洁,性能得到提高。你的项目将获得安全性、灵活性和更好的错误消息。如果你已经迁移到Java11,那么迁移到Java17 会很顺利。
Java17LTSJava112024-11-30

Java之怎么实现从Map到HashMap

本篇内容主要讲解“Java之怎么实现从Map到HashMap”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java之怎么实现从Map到HashMap”吧! 一、 Map1.1 Map 接口在 J
2023-06-15

十分钟从Java 8到Java 15

我将展示每个Java版本的至少一项重大改进,一直到2020年秋季发布的Java 15都有。
Java8Java15Java2024-12-03

八个从Java 11到Java17中的功能提升

从Java 11迁移到Java 17可带来多项好处,包括新功能和性能改进。然而,在迁移过程中需要注意潜在的问题。本文将介绍Java 17的新特性和在迁移过程中需要注意的潜在问题。
Java17开发2024-11-30

开发人员正从 Java 8 向 Java 11 转移

此前的 Java 社区报告曾指出,Java 8 仍是开发人员使用的主要版本,新版本并未“得宠”。但 Snyk 近期发布的 JVM Ecosystem Report 2021 则指出,开发人员已经逐渐从 Java 8 迁移到了 Java 11

【Java从0到1学习】13 Java IO流

1. 流 1.1 流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。 一个流,必有源端和目的端,它们可以是计算机内存的某
2023-08-30

Java 17 快了多少?JDK 17、16 和 11 的性能比较和分析

Java 17 日前正式发布,新版本提供了不少新特性和功能增强。不过对于大多数项目而言,往往需要更改代码才能利用到这些新变化,但性能除外 —— 开发者只需要升级 JDK 版本,就能免费获得性能提升。

我把springboot项目从Java 8 升级 到了Java 17 的过程总结,愿为君提前踩坑!

项目从jdk8升级到jdk17,我不是为了追求java 17的新特性(准确来说也还没有去了解有什么新特性),也不是为了准确与时俱进,永远走在java行列的最前端,纯粹因为项目需要,因为我们都知道,只要项目能跑,你就不要动它! 目
我把springboot项目从Java 8 升级 到了Java 17 的过程总结,愿为君提前踩坑!
2023-12-23

大多数 Java 开发者计划在明年内过渡到 Java 17

JRebel 发布了最新的 2022 Java 开发人员生产力报告。探讨了 2022 年 Java 开发人员调查的结果,并详细说明了 Java 开发的最大趋势如何影响从技术选择到部署和提交时间的方方面面。

Java EJB从入门到精通的进阶之路

探索 Java EJB:从初学者到专家的进阶指南
Java EJB从入门到精通的进阶之路
2024-02-20

Java数据结构之LinkedList从链表到实现

LinkedList是Java中常用的数据结构之一,实现了链表的特性,支持快速添加、删除元素,可以用于实现队列、栈、双向队列等数据结构。LinkedList的内部实现采用了双向链表,其中每个节点都包含前驱节点和后继节点的引用,可以直接访问链表的头尾元素
2023-05-18

Java 11 到 Java 21:无缝迁移的可视化指南

在这个详尽的指南中,我们将带你领略从 Java 11 到 Java 21 的无缝迁移之旅。作为软件开发者,紧跟技术发展潮流至关重要,而 Java 21 正是这一领域的最新成果。本文将深入探讨迁移的原因、优势以及实际操作步骤,帮助你轻松应对这

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录