java-8 - 用于字符串操作的 Java 8 Streams

标签 java-8 java-stream

我想在一个字符串上执行多个任务。
我需要获取一个字符串并使用分隔符( "/" )提取不同的子字符串,然后反转子字符串列表,最后使用另一个分隔符( "." )将它们连接起来,使得 /tmp/test/hello/world/会变成:world.hello.test.tmp
使用Java 7,代码如下:

String str ="/tmp/test/";
List<String> elephantList = new ArrayList<String>(Arrays.asList(str.split("/")));

StringBuilder sb = new StringBuilder();
for (int i=elephantList.size()-1; i>-1; i--) {
    String a = elephantList.get(i);
    if (a.equals(""))
    {
        elephantList.remove(i);
    }
    else
    {
        sb.append(a);
        sb.append('.');
    }
}
sb.setLength(sb.length() - 1);
System.out.println("result" + elephantList + "   " + sb.toString());

我想知道如何使用 Java 8 流和它对字符串的连接函数来做同样的事情

最佳答案

最直接的方法是将术语收集到一个列表中,反转列表并加入新的分隔符:

import static java.util.stream.Collectors.toCollection;

List<String> terms = Pattern.compile("/")
        .splitAsStream(str)
        .filter(s -> !s.isEmpty())
        .collect(toCollection(ArrayList::new));

Collections.reverse(terms);

String result = String.join(".", terms);

您可以在不收集到中间列表的情况下执行此操作,但它的可读性会降低,并且出于实际目的不值得麻烦。

要考虑的另一个问题是您的字符串似乎是路径。通常最好使用 Path类而不是手动拆分“/”。以下是您将如何执行此操作(此方法还演示了如何在索引上使用 IntStream 以向后流式传输列表):
Path p = Paths.get(str);

result = IntStream.rangeClosed(1, p.getNameCount())
        .map(i -> p.getNameCount() - i)  // becomes a stream of count-1 to 0
        .mapToObj(p::getName)
        .map(Path::toString)
        .collect(joining("."));

这将具有独立于操作系统的优势。

关于java-8 - 用于字符串操作的 Java 8 Streams,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42151838/

相关文章:

java-8 - 如何在google CacheCacheLoader中传递多个参数?

Java编译错误(javax.swing.JComponent)

java - 使用扫描仪时输出末尾出现看似随机的字符

java - Collectors-map-java8 内 lambda 中的类类型

java - Java中使用流比较两个List元素并返回

java - 为什么 Java Streams 是一次性的?

Java <Streams> 如何根据列表组件的数量对我的对象列表进行排序

java-8 - 缓存 Java 8 流

java - 使用 Java 8 连接集合

java - 并行流中的异常详细信息不一致