[英]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.