你有一個思想,我有一個思想,我們交換后,一個人就有兩個思想
If you can NOT explain it simply, you do NOT understand it well enough
現陸續將Demo代碼和技術文章整理在一起 Github實踐精選,本文同樣收錄在此,方便大家閱讀查看,覺得不錯,還請Star🌟
日常工作對集合操作真的太頻繁了,前端時間就寫過一篇關於Java 12 集合的文章 Java12 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 -> throw new IllegalStateException("Illegal day entry :: " + day);
};
System.out.println(isWeekend);
注意: 要使用此預覽特性,請記住,我們必須在應用程序啟動期間使用-enable-preview標志顯式地指示JVM。
Compact Number Formatting (緊湊的數據格式)
由用戶界面或命令行工具呈現的大數字總是很難展現。使用數字的縮寫形式則要直觀很多。前端為了更有好的數據展現形式,很早就有相應的組件實現了。現在后端小伙伴也可以在java12中應用這個特性了
緊湊的數字表示更易於閱讀,並且在不丟失原始含義的情況下,在屏幕上需要更少的空間。
例子:
3.6M
比3,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近兩年升級真是太快了,了解一些新功能總是沒錯的,大家動手實踐試試吧,以后遇到類似的需求至少能避免我們重復造輪子了.....
靈魂追問
- 你們項目中Java的版本是多少?
- 項目中你會怎樣建議某些工具的升級?
- IntelliJ IDEA的這個接口調試工具真是太好用了!
- MySQL如何分組拼接字符串?
- 跨表更新,看到自己寫的SQL像個憨憨
- 一張圖幫你記憶,Spring Boot 應用在啟動階段執行代碼的幾種方式
- 如何妙用Spring 數據綁定機制