首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减少字符串列表,仅使用Java 8流将前缀添加到最后一个元素

减少字符串列表,仅使用Java 8流将前缀添加到最后一个元素
EN

Stack Overflow用户
提问于 2016-08-09 22:57:46
回答 3查看 4.5K关注 0票数 0

如何减少或收集以逗号和前缀分隔的字符串列表,以及“仅到最后一个使用Java 8流的元素?”

例如:

代码语言:javascript
复制
List<String> ls = Arrays.asList("tom","terry","john","kevin","steve");

String result = ls.stream().map(String::toString)
                .collect(Collectors.joining(", "));

System.out.println(result);

这个声明打印=>汤姆,特里,约翰,凯文,史蒂夫。但我想把名单打印成汤姆,特里,约翰,凯文和史蒂夫。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-10 12:33:31

两种解决方案。

笨拙,实际上取子列表:

代码语言:javascript
复制
    String result = ls.stream()
            .limit(ls.size() - 1)
            .collect(Collectors.joining(", ")) + " and " + ls.get(ls.size() - 1);

使用类移动一个位置:

代码语言:javascript
复制
    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)作为摘录。

票数 2
EN

Stack Overflow用户

发布于 2016-08-09 23:13:41

溪流并不能使这变得更容易。你也可以使用String::replaceAll

代码语言:javascript
复制
String input = "tom, terry, john, kevin, steve";
String result = input.replaceAll(", (\\w+)$", " and $1");

System.out.println(result);

输出:

代码语言:javascript
复制
tom, terry, john, kevin and steve
票数 1
EN

Stack Overflow用户

发布于 2016-08-11 05:00:58

流API没有提供实现这一目标的标准方法。我的StreamEx库扩展了标准的Stream,它有一个mapLast方法,在这里很有用。它只允许映射最后一个流元素,剩下的一切都是这样的:

代码语言:javascript
复制
System.out.println(StreamEx.of(ls).mapLast("and "::concat).joining(", "));

结果如下:

代码语言:javascript
复制
tom, terry, john, kevin, and steve

请注意,它在"and“之前添加了逗号,这是可以的(请参阅牛津逗号)。如果您不喜欢它(或者实际上使用禁止这种标点符号的另一种语言),那么它可以用稍微长一些的方式实现:

代码语言:javascript
复制
StreamEx.of(ls)
        .mapLastOrElse(", "::concat, " and "::concat)
        .joining().substring(", ".length());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38861718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档