上一篇讲完了Java11,本文继续讲Java12。Java12对开发者有用的特性不多,但还是有一些实用的字符串增强Java12为进一步增强字符串操作,增加了两个方法。字符串缩进Stringindent(intn)会根据参数n对字符串进行缩进。具体规则是当n>0时,在每行字符串的开头插入n个空格,并将整个字符串右移。当n<0时,每行字符串开头的n个空格被删除。如果实际空格数小于n,则删除该行所有空格,但不改变该行。让我们来做个实验:Stringtext="Hello\nJava12";System.out.println("缩进前");System.out.println(text);System.out.println("右缩进两个字符");Stringindent2=text。indent(2);System.out.println(indent2);System.out.println("左边缩进三个字符,实际只有一个空格");Stringindent3=text.indent(-3);System.out.println(indent3);对应的结果是:stringindentationstringconversionString增加了一个transform方法来函数化字符串操作。Rtransform(Functionf)的目的是加强字符串的函数运算。例如:Stringtxt="hello";//hellohelloStrings=txt.transform(str->str.repeat(2));Java的每个版本都在加强函数式编程。基于内容的文件匹配Java12在Files工具类中新增了一个静态方法Files.mismatch(Path,Path),用于查找两个文件内容(字节)的差异,并返回内容中的第一个字节的两个文件。不匹配字节的位置,如果没有不匹配,则为-1L。//文件比较Pathp1=Files.createTempFile("file1","txt");Pathp2=Files.createTempFile("file2","txt");Files.writeString(p1,"felord.cn");Files.writeString(p2,"felord.cn");//-1L两者内容相同longmismatch=Files.mismatch(p1,p2);该方法与另一个方法Files.isSameFile(Path,Path)的效果类似,但还是有区别的。两者的区别在于Collectors::teeing进一步增强了Stream的聚合操作,增加了teeing操作来实现一些复杂的聚合操作。比如我要统计一个数组的均值在求和中所占的比例,首先需要求均值,然后求求和,再求除,需要三步。Doubleaverage=Stream.of(1,2,3,4,5).collect(Collectors.averagingDouble(i->i));Doubletotal=Stream.of(1,2,3,4,5).collect(收集器.summingDouble(i->i));Doublepercentage=平均值/总数;使用teeing后,一步完成:DoublemeanPercentage=Stream.of(1,2,3,4,5).collect(Collectors.teeing(Collectors.averagingDouble(i->i),Collectors.summingDouble(i->i),(平均,总计)->平均/总计));新的数字格式Java12引入了新的基于区域的紧凑数字格式类CompactNumberFormat,用于缩短长数字。通常程序员喜欢把薪资区间标注为10k-20k,而其他一些行业喜欢标注10000-20000。NumberFormatnFormat=NumberFormat.getCompactNumberInstance(Locale.CHINA,NumberFormat.Style.SHORT);chnFormat.setMaximumFractionDigits(3);//823.2万Stringcformat=chnFormat.format(82323);NumberFormatusFormat=NumberFormat.getCompactNumberInstance(LocaleFormat.US.SHORT);usFormat.setMaximumFractionDigits(3);//82.323KStringuformat=usFormat.format(82323);您还可以自定义CompactNumberFormat以实现个性化数字格式。其他除了上面这些,Java12还有一些预览属性和JVM增强功能,亮点不多。