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