Java 11中的11個隱藏的寶石
ofollow,noindex" target="_blank">Java 11 沒有引入突破性的功能,但包含了許多你可能還沒有聽說過的寶石:
1. Lambda引數的型別推斷
List<EnterpriseGradeType<With, Generics>> types = <font><i>/*...*/</i></font><font>; types.stream() </font><font><i>// this is fine, but we need @Nonnull on the type</i></font><font> .filter(type -> check(type)) </font><font><i>// in Java 10, we need to do this ~> ugh!</i></font><font> .filter((@Nonnull EnterpriseGradeType<With, Generics> type) -> check(type)) </font><font><i>// in Java 11, we can do this ~> better</i></font><font> .filter((@Nonnull <b>var</b> type) -> check(type)) 2. </font>
String :: lines
有多行字串?想要對每一行做點什麼嗎?
<b>var</b> multiline = <font>"This\r\nis a\r\nmultiline\r\nstring"</font><font>; multiline.lines() </font><font><i>// we now have a `Stream<String>`</i></font><font> .map(line -> </font><font>"// "</font><font> + line) .forEach(System.out::println); </font><font><i>// OUTPUT:</i></font><font> </font><font><i>// This</i></font><font> </font><font><i>// is a</i></font><font> </font><font><i>// multiline</i></font><font> </font><font><i>// string</i></font><font> 3. </font>
使用'String :: strip'等來剝離空格
4. 用'String :: repeat'重複字串
5. 使用'Path :: of'建立路徑
Path tmp = Path.of(<font>"/home/nipa"</font><font>, </font><font>"tmp"</font><font>); Path codefx = Path.of(URI.create(</font><font>"http://codefx.org"</font><font>)); </font>
6. 使用'Files :: readString'和'Files :: writeString'讀取和寫入檔案
String haiku = Files.readString(Path.of(<font>"haiku.txt"</font><font>)); String modified = modify(haiku); Files.writeString(Path.of(</font><font>"haiku-mod.txt"</font><font>), modified); </font>
7. 空讀I / O使用'Reader :: nullReader
需要一個丟棄輸入位元組的 OutputStream嗎?需要一個空的 InputStream?使用Reader和Writer但是什麼也不做?Java 11讓你滿意:
InputStream input = InputStream.nullInputStream(); OutputStream output = OutputStream.nullOutputStream(); Reader reader = Reader.nullReader(); Writer writer = Writer.nullWriter();
8. 集合變成一個數組:Collection :: toArray
String[] strings_fun = list.toArray(String[]::<b>new</b>);
9. 使用Optional :: isEmpty表達不存在概念
<b>public</b> <b>boolean</b> needsToCompleteAddress(User user) { <b>return</b> getAddressRepository() .findAddressFor(user) .map(<b>this</b>::canonicalize) .filter(Address::isComplete) .isEmpty(); }
10. 使用謂詞::not 表達 “不”
Stream.of(<font>"a"</font><font>, </font><font>"b"</font><font>, </font><font>""</font><font>, </font><font>"c"</font><font>) </font><font><i>// statically import `Predicate.not`</i></font><font> .filter(not(String::isBlank)) .forEach(System.out::println); </font>
11. 使用'Pattern :: asMatchPredicate'作為謂詞的正則表示式
Pattern nonWordCharacter = Pattern.compile(<font>"\\W"</font><font>); Stream.of(</font><font>"Metallica"</font><font>, </font><font>"Motörhead"</font><font>) .filter(nonWordCharacter. </font>
asMatchPredicate
()) .forEach(System.out::println);
asMatchPredicate是要求整個字串匹配,而asPredicate 只需要字串中出現過或有匹配的一段子串即可,要求不高。