如何使用Java 8和StringJoiner连接列表中的两个字段?

问题描述 投票:5回答:3

我有课:

public class Item {

   private String first;
   private String second;

   public Item(String first, String second) {
       this.first = first;
       this.second = second;
   }
}

以及这些对象的列表:

List<Item> items = asList(new Item("One", "Two"), new Item("Three", "Four"));

我的目标是加入元素列表以构建以下字符串:

One: Two; Three: Four;

我试过使用StringJoiner,但看起来它设计用于处理一些简单类型的列表。

java string java-8
3个回答
9
投票

你可以试试这样的东西:

final String result = items.stream()
        .map(item -> String.format("%s: %s", item.first, item.second))
        .collect(Collectors.joining("; "));

正如assylias在下面的评论中提到的,使用这种结构将错过最后的;。它可以手动添加到最终的String中,也可以尝试使用assylias建议的解决方案。


10
投票

您可以将项目映射到连接字段的字符串,然后连接项目,用空格分隔它们:

String result = items.stream()
                     .map(it -> it.field1 + ": " + it.field2 + ";")
                     .collect(Collectors.joining(" "));

2
投票

第一步是加入field1field2

第二步是加入;

请注意,这不会在最后添加;

List<Item> items = asList(new Item("One", "Two"), new Item("Three", "Four"));

String joined = items.stream()
        // First step
        .map(it -> it.field1 + ": " + it.field2)
        // Second step
        .collect(Collectors.joining("; "));

Somewhat more OO

或者更好的是:移动逻辑将field1field2加入专用方法:

public static class Item {
    private String field1;
    private String field2;

    public Item(String field1, String field2) {
        this.field1 = field1;
        this.field2 = field2;
    }

    public String getField1And2() {
        return field1 + ": " + field2;
    }

}

并在流中使用那个。

String joined = items.stream()
        .map(Item::getField1And2)
        .collect(Collectors.joining("; "));
© www.soinside.com 2019 - 2024. All rights reserved.