专栏首页日拱一兵Java12可用新特性一览

Java12可用新特性一览

  • 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想
  • If you can NOT explain it simply, you do NOT understand it well enough

现陆续将Demo代码和技术文章整理在一起 Github实践精选(https://github.com/FraserYu/learnings),「本文同样收录在此」,方便大家阅读查看,觉得不错,还请Star?

日常工作对集合操作真的太频繁了,前端时间就写过一篇关于Java 12 集合的文章 JDK12 Collectors.teeing 功能真香 , 有朋友留言说这个功能比较好用。个人觉得 Java12还有几个特性可以尝试使用,这篇文章就出炉了

如果你目前使用的Java版本不是12,也没有关系,早已为你准备好良方,SDKMAN 统一灵活管理多版本Java ,可以让你快速各种尝鲜新特性

String API 变化

String.indent()

indent 「缩进」这个单词大家很熟悉了,这是Java12处理字符串的新功能,先来看方法定义:

该方法很简单,只接收一个 int 类型的参数表示缩进值,这里的 n 既可以是正数,也可以是负数,只不过是增加空格 space 和移除空格的差别,来看个例子:

String result = "foo\nbar\nbar2".indent(4);
System.out.println(result);

打印结果是这样的(考验眼力的时候到了,仔细看截图在IDE中设置的缩进小点点?):

调用 indent 方法会自动添加一个换行符号 \n ,在该方法的实现中也明确给了注释说明,目的是为了行终结符的规范化

**注意:**对于 Tab 就是当成一个字符来看到,比如我们把上面的例子稍作修改:

String result = "foo\nbar\n\tbar2".indent(4);
System.out.println(result);

来看打印结果,注意和上面的不同:

就是这么简单,我们继续向下看

String.transform()

transform 「转换」,我们经常会遇到字符串形势转换的需求,transform方法接收一个 Function 类型的参数, 生成一个全新形式的字符串

List<String> names = List.of( "   Alex", "brian");

List<String> transformedNames = new ArrayList<>();

for (String name : names){
	String transformedName = name.transform(String::strip)
															 .transform(StringUtils::toCamelCase);

	transformedNames.add(transformedName);
}

有朋友可能会说,这个和单纯的对字符串 trim 或者其他操作有什么区别啊?因为接受的参数是 Function类型,当Function类型作为入参时,内部的「处理逻辑」将增加更多灵活性

Files.mismatch(Path, Path)

有时候,我们需要比较两个文件的内容是否相同,这个API就派上用场了,该方法比较两个 path 下的文件,并且返回一个 long 值,这个值表示第一处不匹配的字节位置。如果返回-1,说明两个文件相等,还是来看个例子:

Path file1 = Paths.get("/Users/fraser/Documents/projects/personal/learning-demo-collection/jdk12-demo/src/file1.txt");
		Path file2 = Paths.get("/Users/fraser/Documents/projects/personal/learning-demo-collection/jdk12-demo/src/file2.txt");


		try {
			long mismatch = Files.mismatch(file1, file2);
			System.out.println(mismatch);
		} catch (IOException e) {
			e.printStackTrace();
		}

两个文件内容分别是:

//file1.txt
大家好,我是日拱一兵,叫我拱哥就好
//file2.txt
大家好,我是日拱一兵,叫我兵兵就好

查看运行结果:

❝建议大家查看一下 mismatch 的实现逻辑,有个小算法在里面的 ❞

Support for Unicode 11 (当个了解就好了)

当下,Emoji 表情符号在社交媒体渠道上扮演着重要角色,所以支持最新的 Unicode 规范比以往任何时候都更重要。Java 12保持了同步并支持Unicode 11。Unicode 11增加了684个字符,共137,374个字符,增加了7个新脚本,共146个脚本。

Switch Expressions(Preview)

这个更改扩展了switch语句。为什么这么说?

  • 语句(我们原来那样使用)
  • 表达式(不必为每个case块定义一个break语句,我们可以简单地使用箭头语法)
  • 变量赋值(使用新的switch表达式,我们可以直接将switch语句分配给一个变量)
boolean isWeekend = switch (day)
{
    case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> false;
 
    case SATURDAY, SUNDAY -> true;
 
    default -> thrownew IllegalStateException("Illegal day entry :: " + day);
};
 
System.out.println(isWeekend);

❝「注意:」 要使用此预览特性,请记住,我们必须在应用程序启动期间使用-enable-preview标志显式地指示JVM。 ❞

Compact Number Formatting (紧凑的数据格式)

由用户界面或命令行工具呈现的大数字总是很难展现。使用数字的缩写形式则要直观很多。前端为了更有好的数据展现形式,很早就有相应的组件实现了。现在后端小伙伴也可以在java12中应用这个特性了

紧凑的数字表示更易于阅读,并且在不丢失原始含义的情况下,在屏幕上需要更少的空间。

❝例子:3.6M3,600,000 容易读得多 ❞

Java 12 引入了一个叫做 NumberFormat.getCompactNumberInstance(Locale, NumberFormat.Style)的静态方法。用于创建紧凑数字表示形式,来看例子:

		NumberFormat formatter = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);

		String formattedString = formatter.format(25000L);
		System.out.println(formattedString);

来看运行结果:

另外,CompactNumberFormat 是 NumberFormat的子类,我们可以自定义它的实例(其实就是格式化样式等),很简单,这个大家自行查看吧

总结

Java近两年升级真是太快了,了解一些新功能总是没错的,大家动手实践试试吧,以后遇到类似的需求至少能避免我们重复造轮子了.....

灵魂追问

  1. 你们项目中Java的版本是多少?
  2. 项目中你会怎样建议某些工具的升级?

本文分享自微信公众号 - 日拱一兵(gh_6235a38420b9),作者:tan日拱一兵

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 除了FastJson,你还有选择: Gson简易指南

    这个周末被几个技术博主的同一篇公众号文章 fastjson又被发现漏洞,这次危害可导致服务瘫痪! 刷屏,离之前的漏洞事件没多久,FastJson 又出现严重 B...

    用户4172423
  • 基础面试,为什么面试官总喜欢问String?

    关于 Java String,这是面试的基础,但是还有很多童鞋不能说清楚,所以本文将简单而又透彻的说明一下那个让你迷惑的 String

    用户4172423
  • 预防XSS,这几招管用!

    大家应该都听过 XSS (Cross-site scripting) 攻击问题,或多或少会有一些了解,但貌似很少有人将这个问题放在心上。一部分人是存有侥幸心理:...

    用户4172423
  • Java12可用新特性一览

    现陆续将Demo代码和技术文章整理在一起 Github实践精选(https://github.com/FraserYu/learnings),「本文同样收录在此...

    用户1516716
  • Hive 子查询

    Hive仅在FROM子句中支持子查询(从Hive 0.12版本开始)。必须为子查询指定名称,因为FROM子句中的每个表都必须具有名称。子查询 SELECT 列表...

    smartsi
  • 专访|网易有道段亦涛:丁磊亲自过问的神经网络翻译技术到底是什么?

    AI科技评论按:很多读者在思考,“我和AI科技评论的距离在哪里?”答案就是:一封求职信。 近日,网易有道正式对外公布:由网易公司自主研发的神经网络翻译( Neu...

    AI科技评论
  • 发动机控制器集成测试系统

    航空发动机是一种高度复杂和精密的动力装置,直接影响飞机的性能、可靠性及经济性,是一个国家科技、工业和国防实力的重要体现。航空发动机是飞机的心脏,在飞机系统中占据...

    hwafuture
  • Facebook vs YouTube视频营销大战,到底哪家强?

    译者:李晓艳 本文长度为3631字,预估阅读时间5分钟。 我们今天要向大家分享Facebook vs YouTube视频营销大战到底哪家强的一些观点。 近年来线...

    iCDO互联网数据官
  • 在centos7上安装Elasticsearch 6

    Elasticsearch is a highly scalable open-source full-text search and analytics en...

    皇上得了花柳病
  • Java Stream 源码分析

    Java 8 的 Stream 使得代码更加简洁易懂,本篇文章深入分析 Java Stream 的工作原理,并探讨 Steam 的性能问题。

    Yano_nankai

扫码关注云+社区

领取腾讯云代金券