如何减少或收集以逗号和前缀分隔的字符串列表,以及“仅到最后一个使用Java 8流的元素?”
例如:
List<String> ls = Arrays.asList("tom","terry","john","kevin","steve");
String result = ls.stream().map(String::toString)
.collect(Collectors.joining(", "));
System.out.println(result);这个声明打印=>汤姆,特里,约翰,凯文,史蒂夫。但我想把名单打印成汤姆,特里,约翰,凯文和史蒂夫。
发布于 2016-08-10 12:33:31
两种解决方案。
笨拙,实际上取子列表:
String result = ls.stream()
.limit(ls.size() - 1)
.collect(Collectors.joining(", ")) + " and " + ls.get(ls.size() - 1);使用类移动一个位置:
class SbS {
StringBuilder sb = new StringBuilder();
String s = "";
@Override
public String toString() {
return sb + (s.empty() ? "" : " and " + s);
}
}
result = ls.stream()
.collect(SbS::new,
(a, s) -> {
a.sb.append(a.sb.length() == 0 ? "" : ", ").append(a.s); a.s = s;
},
(a1, a2) -> {}).toString();注意:类定义应该放在方法中,就像上面一样。否则,就需要static。(a, s)的lambda可以是SbS中的一个方法。对并行性的支持留给读取器(a1, a1)作为摘录。
发布于 2016-08-09 23:13:41
溪流并不能使这变得更容易。你也可以使用String::replaceAll
String input = "tom, terry, john, kevin, steve";
String result = input.replaceAll(", (\\w+)$", " and $1");
System.out.println(result);输出:
tom, terry, john, kevin and steve发布于 2016-08-11 05:00:58
流API没有提供实现这一目标的标准方法。我的StreamEx库扩展了标准的Stream,它有一个mapLast方法,在这里很有用。它只允许映射最后一个流元素,剩下的一切都是这样的:
System.out.println(StreamEx.of(ls).mapLast("and "::concat).joining(", "));结果如下:
tom, terry, john, kevin, and steve请注意,它在"and“之前添加了逗号,这是可以的(请参阅牛津逗号)。如果您不喜欢它(或者实际上使用禁止这种标点符号的另一种语言),那么它可以用稍微长一些的方式实现:
StreamEx.of(ls)
.mapLastOrElse(", "::concat, " and "::concat)
.joining().substring(", ".length());https://stackoverflow.com/questions/38861718
复制相似问题