Java 11中的11個隱藏的寶石

banq發表於2018-11-17

Java 11沒有引入突破性的功能,但包含了許多你可能還沒有聽說過的寶石:

1. Lambda引數的型別推斷

List<EnterpriseGradeType<With, Generics>> types = /*...*/;
types.stream()
    // this is fine, but we need @Nonnull on the type
    .filter(type -> check(type))
    // in Java 10, we need to do this ~> ugh!
    .filter((@Nonnull EnterpriseGradeType<With, Generics> type) -> check(type))
    // in Java 11, we can do this ~> better
    .filter((@Nonnull var type) -> check(type))

2.
String :: lines
有多行字串?想要對每一行做點什麼嗎?

var multiline = "This\r\nis a\r\nmultiline\r\nstring";
multiline.lines()
    // we now have a `Stream<String>`
    .map(line -> "// " + line)
    .forEach(System.out::println);
 
// OUTPUT:
// This
// is a
// multiline
// string

3. 
使用'String :: strip'等來剝離空格

4.  用'String :: repeat'重複字串

5. 使用'Path :: of'建立路徑

Path tmp = Path.of("/home/nipa", "tmp");
Path codefx = Path.of(URI.create("http://codefx.org"));


6. 使用'Files :: readString'和'Files :: writeString'讀取和寫入檔案

String haiku = Files.readString(Path.of("haiku.txt"));
String modified = modify(haiku);
Files.writeString(Path.of("haiku-mod.txt"), modified);


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[]::new);


9. 使用Optional :: isEmpty表達不存在概念

public boolean needsToCompleteAddress(User user) {
    return getAddressRepository()
        .findAddressFor(user)
        .map(this::canonicalize)
        .filter(Address::isComplete)
        .isEmpty();
}


10. 使用謂詞::not 表達 “不”

Stream.of("a", "b", "", "c")
    // statically import `Predicate.not`
    .filter(not(String::isBlank))
    .forEach(System.out::println);


11. 使用'Pattern :: asMatchPredicate'作為謂詞的正規表示式

Pattern nonWordCharacter = Pattern.compile("\\W");
Stream.of("Metallica", "Motörhead")
    .filter(nonWordCharacter.
asMatchPredicate
())
    .forEach(System.out::println);


asMatchPredicate是要求整個字串匹配,而asPredicate 只需要字串中出現過或有匹配的一段子串即可,要求不高。
 

相關文章