gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:58:11 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com