使用流将对象列表转换为从toString方法获取的字符串

279

Java 8中有许多有用的新功能。例如,我可以使用流迭代遍历对象列表,然后对Object实例的特定字段的值进行求和。例如:

public class AClass {
  private int value;
  public int getValue() { return value; }
}

Integer sum = list.stream().mapToInt(AClass::getValue).sum();

因此,我想问是否有办法构建一个String,将多个实例的toString()方法的输出连接成一行。

List<Integer> list = ...

String concatenated = list.stream().... //concatenate here with toString() method from java.lang.Integer class

假设list包含整数123,我希望concatenated"123""1,2,3"


可能是Java:将List <String>转换为String的重复问题。 - Vadzim
15个回答

0
String actual = list.stream().reduce((t, u) -> t + "," + u).get();

7
通常,在您的帖子中添加一个解释有关代码如何工作的内容是一个好主意。这样可以让新开发人员了解代码的功能。 - Caleb Kleveter
1
@CalebKleveter 它将一个 List 缩减为单个 String,并用逗号(,)分隔每个元素。 - Joe Almore
2
你的解决方案仅适用于list是List<String>的情况。OP没有指定这样的类。在他的问题中,甚至指出了List<Integer>。在这种情况下,你的代码无法编译。 - RubioRic

0
我打算使用流API将一串整数转换为单个字符串。提供的答案中存在问题,因为它们会由于字符串构建而产生O(n ^ 2)的运行时间。更好的解决方案是使用StringBuilder,然后在最后一步将字符串连接起来。
//              Create a stream of integers 
    String result = Arrays.stream(new int[]{1,2,3,4,5,6 })                
            // collect into a single StringBuilder
            .collect(StringBuilder::new, // supplier function
                    // accumulator - converts cur integer into a string and appends it to the string builder
                    (builder, cur) -> builder.append(Integer.toString(cur)),
                    // combiner - combines two string builders if running in parallel
                    StringBuilder::append) 
            // convert StringBuilder into a single string
            .toString();

您可以通过将对象集合转换为单个字符串来进一步完善此过程。
// Start with a class definition
public static class AClass {
    private int value;
    public int getValue() { return value; }
    public AClass(int value) { this.value = value; }

    @Override
    public String toString() {
        return Integer.toString(value);
    }
}

// Create a stream of AClass objects
        String resultTwo = Arrays.stream(new AClass[]{
                new AClass(1),
                new AClass(2),
                new AClass(3),
                new AClass(4)
        })
                // transform stream of objects into a single string
                .collect(StringBuilder::new,
                        (builder, curObj) -> builder.append(curObj.toString()),
                        StringBuilder::append
                )
            // finally transform string builder into a single string
            .toString();

-1

我们可以试试这个。

public static void main(String []args){
        List<String> stringList = new ArrayList<>();
        for(int i=0;i< 10;i++){
            stringList.add(""+i);
        }
        String stringConcated = String.join(",", stringList);
        System.out.println(stringConcated);

    }

你的解决方案仅适用于列表是List<String>的情况。OP没有指定这样的类,他在问题中甚至指出了List<Integer>。 - EduardoMaia

-2

使用 Java 8+

String s = Arrays.toString(list.stream().toArray(AClass[]::new));

虽然不是最高效的方法,但这是一个代码量较少的解决方案。


-2

另外,你也可以这样做。

    List<String> list = Arrays.asList("One", "Two", "Three");
    String result = String.join(", ", list);
    System.out.println(result);

你的解决方案仅适用于list是List<String>的情况。OP没有指定这样的类。在他的问题中,甚至还指出了List<Integer>。 - RubioRic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接