将整数列表转换为逗号分隔的字符串

12

我试图将整数列表转换为以逗号分隔的整数字符串。

Collectors.joining(CharSequence delimiter) - 返回一个收集器,按照遇到的顺序用指定的分隔符连接输入元素。

List<Integer> i = new ArrayList<>();    //  i.add(null);
for (int j = 1; j < 6; j++) {
    i.add(j);
}
System.out.println(i.stream().collect(Collectors.joining(","))); // Line 8

我在第8行遇到了一个错误:

类型Stream中的方法collect(Collector<?super Integer,A,R>)不适用于参数(Collector<CharSequence,capture#20-of?,String>)

在Java 8中是否有使用流的方法来解决这个问题?

如果我使用字符串列表"1", "2", "3","4","5",它可以运行。


2
你需要将 Integer 映射为 String 才能使用 joining。它返回特定的 Collector<CharSequence, ?, String> - Naman
你可以循环一次又一次,逐个用逗号给字符串赋值。 - Bhaven Shah
5个回答

47

是的,不过 Stream<Integer> 没有 Collectors.joining 方法;你需要一个 Stream<String>,所以在收集之前需要使用 map。可以这样写:

System.out.println(i.stream().map(String::valueOf)
        .collect(Collectors.joining(",")));

输出的内容

1,2,3,4,5

此外,您可以通过多种方式生成Stream<Integer>

System.out.println(
        IntStream.range(1, 6).boxed().map(String::valueOf)
               .collect(Collectors.joining(","))
);

该方法的描述是“返回一个收集器,它按遇到顺序将输入元素用指定的分隔符连接起来。”他们不应该提到输入元素只能是字符串吗? - Nicky
另外,我认为它会自动调用Integer的toString方法来解决这个问题。 - Nicky
文档还指出:“*返回:一个收集器,按照遭遇顺序连接指定分隔符的CharSequence元素。”(返回类型为Collector<CharSequence,​?,​String>,即接受CharSequenceCollector)。 - user85421
@Naman 如果我不使用重载方法怎么办?我也可以使用Collectors.joining(),它会将输入元素按遇到的顺序连接成一个字符串并返回一个收集器。 - Nicky
1
如果您阅读了整个定义,它会说 static Collector<CharSequence,?,String> joining​(CharSequence delimiter),这告诉您它适用的类型(CharSequence)。 - Jim Garrison
显示剩余2条评论

12

使用Apache Commons Lang库非常简单。

Commons Lang

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
String str = org.apache.commons.lang.StringUtils.join(list, ","); // You can use any delimiter
System.out.println(str);  // Output: 1, 2, 3, 4, 5, 6, 7

Java 8 解决方案

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
String joinedList = list.stream().map(String::valueOf).collect(Collectors.joining(","));
System.out.println(joinedList);

这应该是被接受的答案,简洁、优雅,并且实现了它应该做的事情。 - Gladiator9120

2

使用Guavacom.google.common.base.Joiner

String res = Joiner.on(",").join(integerlist);

使用Java Stream API
String res = integerlist.stream()
                        .map(String::valueOf)
                        .collect(Collectors.joining(","));

0
也许你问题的答案是:

List.toString(),如下所示:

List<Integer> intList = new ArrayList<Integer>();
intList.add(1);
intList.add(2);
intList.add(3);

String listString = intList.toString();
System.out.println(listString); // <- this prints [1, 2, 3]

在下面的帖子中,它被很好地解释了。我希望你能发现它有用:
Java: 将List 转换为String

0
如果您已经在使用 Spring 框架,它们提供了一个用于字符串操作的实用类 StringUtils。
List<Integer> privileges = Arrays.asList(1,2,3);

System.out.println(StringUtils.collectionToDelimitedString(privileges, ","));

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