繁体   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