转载

Java 11中的11个隐藏的宝石

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 只需要字符串中出现过或有匹配的一段子串即可,要求不高。

原文  https://www.jdon.com/50760
正文到此结束
Loading...