使用stream.collect(Collectors.joining(", "))
我可以轻松地加入由逗号分隔的所有字符串。可能的结果是"a, b, c"
。但是如果我想让最后一个分隔符有所不同,该怎么办?例如为" and "
,因此我得到"a, b and c"
。有一个简单的解决方案吗?加入具有不同最后分隔符的字符串
回答
尝试用stream.collect(Collectors.joining(" and "))
第一连结最后2串再加入所有剩余的字符串,并与你在你的问题中使用的代码这一新的字符串:stream.collect(Collectors.joining(", "))
。
如果它们已经在列表中,则不需要流;只需加入所有的子表,但最后一个元素和CONCAT其他分隔符和最后一个元素:
int last = list.size() - 1;
String joined = String.join(" and ",
String.join(", ", list.subList(0, last)),
list.get(last));
这里有一个版本,不使用Collectors.collectingAndThen:
stream.collect(Collectors.collectingAndThen(Collectors.toList(),
joiningLastDelimiter(", ", " and ")));
public static Function<List<String>, String> joiningLastDelimiter(
String delimiter, String lastDelimiter) {
return list -> {
int last = list.size() - 1;
if (last < 1) return String.join(delimiter, list);
return String.join(lastDelimiter,
String.join(delimiter, list.subList(0, last)),
list.get(last));
};
}
此版本还可以处理的情况下,上述流是空的或只有一个值。感谢Holger和Andreas的建议,这大大改进了这个解决方案。
我曾建议在的评价是牛津逗号可以用这种使用", "
和", and"
作为分隔符来完成,但产生的"a, and b"
不正确的结果有两个元素,所以只是为了好玩这里有一个正确呢牛津逗号:
stream.collect(Collectors.collectingAndThen(Collectors.toList(),
joiningOxfordComma()));
public static Function<List<String>, String> joiningOxfordComma() {
return list -> {
int last = list.size() - 1;
if (last < 1) return String.join("", list);
if (last == 1) return String.join(" and ", list);
return String.join(", and ",
String.join(", ", list.subList(0, last)),
list.get(last));
};
}
另外,我把它粘贴到Eclipse中,并得到一个编译错误,可以通过明确给出类型来修复:'收集器。
Hmm,'javac'不会给我一个编译错误,但我可以添加显式类型。什么版本的Eclipse? –
因为这里唯一相关的函数是* finisher *,你可以简单地使用'Collectors.collectingAndThen(Collectors.toList(),list - > {...})'顺便说一句,你也可以使用'String.join(lastDelimiter,String.join(delimiter,list.subList (0,last)),list.get(last))'返回语句 – Holger
String str = "a , b , c , d";
String what_you_want = str.substring(0, str.lastIndexOf(","))
+ str.substring(str.lastIndexOf(",")).replace(",", "and");
// what_you_want is : a , b , c and d
如果您正在寻找老的Java解决方案,使用Guava libraries会很容易。
List<String> values = Arrays.asList("a", "b", "c");
String output = Joiner.on(",").join(values);
output = output.substring(0, output.lastIndexOf(","))+" and "+values.get(values.size()-1);
System.out.println(output);//a,b and c
List<String> names = Arrays.asList("Thomas", "Pierre", "Yussef", "Rick");
int length = names.size();
String result = IntStream.range(0, length - 1).mapToObj(i -> {
if (i == length - 2) {
return names.get(i) + " and " + names.get(length - 1);
} else {
return names.get(i);
}
}).collect(Collectors.joining(", "));
- 1. 加入字符串分隔符不同
- 2. 加入具有不同最终分隔符的字符串数组
- 3. 分隔几个具有相同标识符的字符串
- 4. 拆分字符串当没有分隔符加入的词
- 5. 如何将具有不同值的字符串拆分为多个分隔符?
- 6. 分割Python字符串中的最后一个分隔符?
- 7. 使用stringstream标记一个具有不同的分隔符的字符串
- 8. php函数将字符串分隔成不同的字符串?
- 9. 做空格将字符串分隔成不同的字符串?
- 10. 加入逗号分隔字符串
- 11. 如何分割具有多个分隔符的Python字符串?
- 12. 在分隔符后面查找最后一个字符串:Javascript
- 13. 分隔带分隔符的字符串
- 14. 由两个不同的分隔符分割的字符串
- 15. 字符串分割到字符串数组没有分隔符
- 16. 分隔字符串与分隔符
- 17. 用“||”分隔字符串分隔符
- 18. 分隔符分隔字符串RadTreeView VB.NET
- 19. 用分隔符分隔字符串
- 20. 在字符串中最后一次出现分隔符后删除字符
- 21. 分割字符串,并给予代码不同的分隔符
- 22. 用两个不同的分隔符分割字符串
- 23. 一次性使用不同分隔符的分割字符串
- 24. 添加分隔符后在Java中分割字符串
- 25. 从具有句点分隔符的字符串中选择第一个或最后一个字符组
- 26. 遍历Crystal 2011中具有逗号分隔符的字符串
- 27. 如何在最终分隔符后提取子字符串?
- 28. ListView的最后一项之后的分隔符(分隔符)
- 29. 验证字符串有没有空间字符,只有第一和最后一个字符作为分隔符
- 30. python3字符串分隔符
说实话 - 不,没有。 'Collectors.joining'使用一些非常尴尬的技巧,当你尝试这样做时会完全崩溃。 –
实现您自己的['Collector'](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collector.html)。至于“轻松”,这是一个技巧和意见的问题。 – Andreas
@Andreas是否有可能实现这样一个收藏家?收集器如何知道何时使用特殊分隔符? –