如何使用 Java 中的流 API 将
List<String> = ["SSSttttrrrriiiiinnnggg","vvvvvooootttteee","mmmmaaaaddddaaaammm"]
转换为 List<String> =["String","eotv","dam"]
?
我可以使用下面的代码消除字符串中的重复项,但我不确定如何处理字符串列表。顺序并不重要,如果字母重复多次,也不得出现在输出中。
String string = "SSSttttrrriiiinnnnnggg";
string.chars()
.mapToObj(item -> (char) item)
.collect(Collectors.toSet()).forEach(System.out::print);
IntStream#distinct
来仅获取不同的字符:
string
.codePoints()//all code points (~chars)
.distinct()//only distinct code points
.collect(StringBuilder::new,
StringBuilder::appendCodePoint,
StringBuilder::append)//convert back to string
.toString();
请参阅此答案,了解
IntStream
的代码点和字符串之间的转换。
然后你可以把它包在另一个
Stream:
list
.stream()
.map(string->
string
.codePoints()
.distinct()
.collect(StringBuilder::new,
StringBuilder::appendCodePoint,
StringBuilder::append)
.toString();
).toList()
您可以使用
Stream#map
来变换 Stream
的每个元素。 .distinct
可用于删除重复项,仅保留每个唯一字符的一份副本。
var res = strs.stream().map(s -> s.chars().distinct()
.mapToObj(c -> String.valueOf((char) c))
.collect(Collectors.joining())).toList();
您可以使用
map()
类的 stream
方法来压缩列表中的每个字符串,然后使用collect() 方法将结果收集回列表中。
您可以这样做:
List<String> list = Arrays.asList("SSSttttrrrriiiiinnnggg","vvvvvooootttteee","mmmmaaaaddddaaaammm");
List<String> compressedList = list.stream()
.map(s -> {
StringBuilder sb = new StringBuilder();
char prev = 0;
int count = 0;
for (char c : s.toCharArray()) {
if (c != prev) {
if (count > 0) {
sb.append(count);
}
prev = c;
count = 1;
sb.append(c);
} else {
count++;
}
}
sb.append(count);
return sb.toString();
})
.map(s -> {
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
if (Character.isLowerCase(c)) {
sb.append(c);
}
}
return sb.toString();
})
.collect(Collectors.toList());
System.out.println(compressedList);
此代码首先使用
StringBuilder
压缩每个字符串以跟踪字符和计数,然后使用另一个 StringBuilder
删除所有非小写字符。最终结果被整理成清单并打印。结果将是:
[String, eotv, dam]