JDK17新特性之--JDK9到JDK17 String 新增的新方法

这篇具有很好参考价值的文章主要介绍了JDK17新特性之--JDK9到JDK17 String 新增的新方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JDK9之后对String底层存储数据结构进行了重大的修改1,同步也增加了许多新的方法,主要有Text Blocks、chars()、codePoints()、describeConstable()、formatted()、indent()、isBlank()、isEmpty()、lines()、repeat()、strip()、stripLeading()、stripIndent()、stripTrailing()、translateEscapes(),接下来就逐一看看每个方法怎么用。

Text Blocks

在JDK8之前我们想定义一个JSON String必须要各种转义、拼接,可读性非常差,看起来也比较乱,JDK17里我们可以使用"""来定义一个text block,看起来清爽多了

        //JDK8之前想要定义一个JSON数据格式
        String json = "{\n" +
                "    \"name\": \"admin\",\n" +
                "    \"id\": 1\n" +
                "}";
        String json2 = """
                {
                    "name": "admin",
                    "id": 1
                }""";
        //JDK17+
        System.out.println(json);
        System.out.println(json2);
        //true
        System.out.println(json.equals(json2));

使用Text Blocks需要注意以下几点:

  1. Text Blocks就是个语法糖,编译后还是和之前一样
  2. 前后"““必须放在两行,不能放同一行代码中,第一行的””"后面不能放字符串,不然会报Illegal text block start: missing new line after opening quotes

chars()

        String name = "12345工😃";
        //JDK9+ 获取String中所有char字符,一个emoji会获取到多个char
        IntStream chars = name.chars();
        chars.forEach(x -> System.out.println(Character.toChars(x)));
        //输出
        1
        2
        3
        4
        5?
        ?

codePoints()

        String name = "12345工😃";  
        //JDK9+ 获取String中所有char emoji会拆一个  
        IntStream chars = name.codePoints();  
        chars.forEach(x -> System.out.println(Character.toChars(x)));  
        //输出  
        1  
        2  
        3  
        4  
        5  
        工  
        😃

chars()和codePoints()都是获取String中的char,主要区别是codePoints()获取char支持的编码更多了,如果是emoji chars()会得到两个char,codePoints()只会获取一个,想要了解具体的char编码可以参考《其实你并不懂 Unicode》2;

describeConstable()、resolveConstantDesc()

        String name = "12345工😃";
        //JDK12+
        Optional<String> optionalString = name.describeConstable();
        System.out.println(optionalString.get());
        
        public Optional<String> describeConstable() {
             return Optional.of(this);
         }

这个方法比较简单,就是返回一个Optional对象,加入这个方法的主要原因是String实现了Constable和ConstantDesc两个接口,实现这两个接口的目的是JAVA
引入了新的API以对关键类文件和运行时工件的名义描述进行建模,尤其是可以从常量池中加载的常量3

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence,
               Constable, ConstantDesc {
        }
        
    public interface Constable {
        Optional<? extends ConstantDesc> describeConstable();
    }
    
    public sealed interface ConstantDesc
        permits ClassDesc,
                MethodHandleDesc,
                MethodTypeDesc,
                Double,
                DynamicConstantDesc,
                Float,
                Integer,
                Long,
                String {
            Object resolveConstantDesc(MethodHandles.Lookup lookup) throws ReflectiveOperationException;
    }

formatted()

        String name = "12345工😃%s-%d";
        //JDK15+
        String formattedString = name.formatted("admin",1);
        Assertions.assertEquals(String.format(name,"admin",1),formattedString);

formatted()方法等同步于String.format()

indent()

        String name = "1\n2\n3\r4";
        //JDK11 按行缩进
        String indentString = name.indent(20);
        System.out.println("|" + indentString + "|");
        //输出 
        |            1
                    2
                    3
                    4
        |

indent()可以缩进字符串,并且可以按\n、\r、\r\n拆分后将每一行都缩进指定空格

isBlank()、isEmpty()

        //true
        System.out.println("".isBlank());
        //true
        System.out.println("".isEmpty());
        //true        
        System.out.println(" ".isBlank());
        //false
        System.out.println(" ".isEmpty());
        //true
        System.out.println("\t\n".isBlank());
        //false
        System.out.println("\n\n".isEmpty());

这两个方法可以方便我们判断字符串是否为空了

lines()

        String name = "1\n2\r3\r\n4";
        //JDK11+ 按\n\r拆分String
        List<String> lines = name.lines().collect(Collectors.toList());
        lines.forEach(System.out::println);
      //输出
        1
        2
        3
        4

lines()方法可以快速的帮我们将String 按\n、\r、\r\n拆分成一行一行

repeat()

        String name = "Admin";
        //JDK11+ 重复String
        String jdkRepeatString = name.repeat(3);
        /AdminAdminAdmin
        System.out.println(jdkRepeatString);
       

repeat()将字符串重复拼接n次

strip()

        String name = "\u0020 \t admin\0";
        //JDK11+
        System.out.println(name.strip() + "|");
        System.out.println(name.trim() + "|");
        //输出
        admin |
        admin|

strip()和trim()有点类似,不同的是trim()仅删除字符 <= U+0020(空格);strip()删除所有 Unicode 空白字符(但不是所有控制字符,例如 \0)

stripLeading()、stripIndent()、stripTrailing()

        String name = " admin \n admin ";
        //JDK11+
        System.out.println("|"+name.stripLeading()+"|");
        System.out.println("-------------");
        System.out.println("|"+name.stripIndent()+"|");
        System.out.println("-------------");
        System.out.println("|"+name.stripTrailing()+"|");
        //输出
        |admin 
         admin |
        -------------
        |admin
        admin|
        -------------
        | admin 
         admin|

stripLeading()去除前面的空格,stripIndent()可以按\n、\r、\r\n拆分后按行去除前后空格,stripTrailing()去除后面空格

translateEscapes()

        String name = "\b\r\t\f";
        //JDK15+
        String transform = name.translateEscapes();
        System.out.println(transform);

将\b\t\n\f等字面字符转义

JDK17新特性之--JDK9到JDK17 String 新增的新方法


  1. JDK17新特性之–新的Compact Strings(JEP 254) - 掘金 (juejin.cn) ↩︎

  2. 其实你并不懂 Unicode - 知乎 ↩︎

  3. JEP 334: JVM Constants API ↩︎文章来源地址https://www.toymoban.com/news/detail-439539.html

到了这里,关于JDK17新特性之--JDK9到JDK17 String 新增的新方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JDK8中的新特性(Lambda、函数式接口、方法引用、Stream)

    1.1 关于Java8新特性简介 Java 8 (又称为 JDK 8或JDK1.8) 是 Java 语言开发的一个主要版本。 Java 8 是oracle公司于2014年3月发布,可以看成是自Java 5 以来 最具革命性 的版本。Java 8为Java语言、编译器、类库、开发工具与JVM带来了大量新特性。 特性: 速度更快 代码更少(增加了新的语法

    2024年02月05日
    浏览(34)
  • Java 17 版本的新特性

    Java 17 是2021年9月发布的最新版本,其中包含了很多新特性和改进,这些新特性和改进将进一步提高 Java 语言的性能和可用性。在这篇博客中,我们将介绍 Java 17 中的一些重要新特性。 摘要: Java 17是Java编程语言的一个新版本,它引入了一些新的特性和改进,使得Java编程更加

    2024年02月09日
    浏览(36)
  • JDK21:Java21的新特性

    定于9月推出的Java21计划现在包括一个关键封装机制API和32位Windows端口的弃用。 Java开发工具包(JDK)21将于9月作为Oracle标准Java实现的下一个长期支持版本,现在有13个功能被正式提出,最近几天又增加了两个功能。 最新的提议包括密钥封装机制(KEM)API和32位x86 Windows端口的

    2024年02月07日
    浏览(31)
  • JDK21发布了!面试官:来,谈下jdk21的新特性!

    JDK21 计划23年9月19日正式发布,尽管一直以来都是“版随意出,换 8 算我输”,但这么多年这么多版本的折腾,若是之前的 LTS 版本JDK17你还觉得不错,那 JDK21还是有必要关注一下,因为会有一批重要更新发布到生产环境中,特别是被众人期待已久的虚拟线程,纵然说这东西我

    2024年02月07日
    浏览(36)
  • JDK 17 新特性 (一)

    既然 Springboot 3.0 强制使用 JDK 17 那就看看 JDK17 有哪些新特性吧 参考链接 介绍一下 新特性的历史渊源 JDK 17是Java Development Kit(JDK)的一个版本,它是Java编程语言的一种实现。JDK 17于2021年9月14日发布,并作为Java SE 17的一部分。在了解JDK 17的新特性之前,让我们先了解一下Ja

    2024年02月22日
    浏览(32)
  • [Java]JDK17新特性

    目录   一、JDK新特性 1.1Java Record 1.1.1Record的使用 1.1.2Instance Methods 1.1.3静态方法 Static Method 1.1.4Record构造方法 1.1.5Record与Lombok 1.1.6Record实现接口 1.1.7Local Record 1.1.8嵌套Record 1.1.9instanceof判断Record类型 1.1.10总结 1.2Switch 1.2.1箭头表达式 1.2.2yield返回值 1.2.3Java Record 1.3Text Block 1.3.1认识

    2024年02月07日
    浏览(35)
  • JDK 8 和 JDK 17 的区别和新特性

    Java是一门广泛使用的编程语言,拥有着丰富的生态系统和大量的开发者。Java的官方实现是Oracle公司的JDK(Java Development Kit),目前最新版本是JDK 17,而JDK 8是一个长期支持版本(LTS)。 JDK 8于2014年发布,引入了许多重要的新特性,如Lambda表达式、Stream API和新的日期时间API等

    2024年02月06日
    浏览(24)
  • 【从零开始学Java第64期】JDK8 关于日期时间的新特性

    本系列为:从零开始学Java,为千锋教育资深Java教学老师独家创作 致力于为大家讲解清晰Java相关知识点,含有丰富的代码案例及讲解。如果感觉对大家有帮助的话,可以【点个关注】持续追更~ 有技术类问题,也欢迎大家和我们交流讨论! 在上一篇文章中本系列内容给大家讲

    2024年02月07日
    浏览(29)
  • JDK8,JDK11,JDK17,JDK21及中间版本主要更新特性

    官方地址: https://www.oracle.com/java/technologies/java-se-support-roadmap.html 从上图可以很清晰得可以看出,JDK7,JDK8,JDK11,JDK17,JDK21是长期维护的版本。从目前来看,JDK8到2023年已经有将近10年的历史了,大多数依据JDK8的相关技术内容已经很成熟了,但是大家也看到,JDK在不断地迭代,JD

    2024年02月21日
    浏览(44)
  • 玩转微服务-基础篇-JDK17实用特性

    OpenJDK Java 17 下载:https://jdk.java.net/archive/ OpenJDK Java 17 文档:https://openjdk.java.net/projects/jdk/17/ 1. VAR 类型推导 JDK 10 的新特性, 这里说明下 var 来支持局部变量的类型推断,var 不是,且只能用于局部变量; var 不能用于字段、方法参数、构造方法参数、方法返回值,也不

    2024年02月05日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包