簡體   English   中英

如何使用Java 8流考慮分割字符串的第一個標記

[英]How to consider first token of splitted string using Java 8 streams

我還是java 8的新手,我想像這樣轉換一個循環:

//result is List<String>
for(String elem:result) {
    if(elem.contains(".")) {
        elem = elem.split("\\.")[0];
    }
}

to java 8 stream style ..我怎么能做到這一點?

到目前為止我嘗試了什么:

result.stream().map(String::split("\\.")[0]);

但它給出了編譯錯誤,而且我也不知道如何處理這個條件

如果你想要一個字符串列表(正如你在代碼注釋中所說)那么這就是你想要的。 不過,您目前的代碼只設置elem最后一個值匹配contains 它不會創建列表。

List<String> elems = result.stream()
    .filter(elem -> elem.contains("."))
    .map(elem -> elem.split("\\.")[0])
    .collect(Collectors.toList());

這不能編譯result.stream().map(String::split("\\.")[0])的原因是因為它不是方法引用的有效語法。 方法引用后的括號String::split(/*anything*/)始終無效。

有關詳細信息,請參閱有關方法引用的Oracle教程

不要為每個元素編譯模式(通過split ),而是在循環之前創建它。 此外,您似乎想要一個新的List作為結果,一些事情:

 Pattern p = Pattern.compile("\\.");
 List<String> out = result
            .stream()
            .map(x -> p.splitAsStream(x).findFirst().orElse(x))
            .collect(Collectors.toList());

另一方面,如果你想做到這一點:

 result.replaceAll(x -> p.splitAsStream(x).findFirst().orElse(x));

因為split()返回整個String,如果沒有分隔符,則不需要if ,並且可以安全地將轉換應用於所有元素。

您可以使用以下代碼替換所有代碼:

result.replaceAll(s -> s.split("\\.")[0]);

-

實際上,您不需要拆分:您可以使用String#replaceAll()從第一個點開始刪除所有內容而不是拆分:

result.replaceAll(s -> s.replaceAll("\\..*", ""));

如果String中沒有點,則對replaceAll("\\\\..*", "")的調用是一個無操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM