我想在一个字符串上执行多个任务。
我需要获取一个字符串并使用分隔符( "/"
)提取不同的子字符串,然后反转子字符串列表,最后使用另一个分隔符( "."
)将它们连接起来,使得 /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/