使用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是否有可能實現這樣一個收藏家?收集器如何知道何時使用特殊分隔符? –