Java 8将整数字符串转换为List<Integer>

16

我有一个字符串:

String ints = "1, 2, 3";

我想将它转换成整数列表:

List<Integer> intList

我可以通过以下方法将其转换为字符串列表:

List<String> list = Stream.of("1, 2, 3").collect(Collectors.toList());

但不是整数列表。

有什么想法吗?


4
你的最后一行代码将会给你一个包含一个元素的列表,该元素的值为 "1, 2, 3" 的字符串。你的意思是使用 Stream.of("1", "2", "3") 吗? - Jesper
4个回答

27

你需要将字符串分割并将每个部分转换为Stream。 方法splitAsStream(input)正是做这件事的:

Pattern pattern = Pattern.compile(", ");
List<Integer> list = pattern.splitAsStream(ints)
                            .map(Integer::valueOf)
                            .collect(Collectors.toList());

它返回一个Stream<String>,包含输入字符串的一部分,您之后可以将其映射为Integer并收集到列表中。

请注意,您可能希望将模式存储在常量中,并在每次需要时重用它。


2
@Igor,其实没有赢家,只有不同的解决方案来完成任务。创建一个数组并将其传递到Stream.of也可以使用,取决于您想要解析的字符串和确切的分隔符(如果它不是“,”),也许使用splitAsStream的这种解决方案比其他方案更快。这需要进行测量。 - Tunaki
5
我更喜欢这个,而不是我的。我之前不知道 Pattern.splitAsStream() 方法。太好了! - Lukas Eder
6
你可以使用Pattern.compile(", ", Pattern.LITERAL);来提示引擎没有实际的模式匹配。当然,引擎会自己发现,没有这个标志也一样,但指定标志可以跳过分析模式的过程。 - Holger

24

正则表达式拆分是您要寻找的内容

Stream.of(ints.split(", "))
      .map(Integer::parseInt)
      .collect(Collectors.toList());

是的,但他特别要求使用Java8的方式来解决这个问题。 - Raul Cuth
这不会创建一个List<Integer>。 - Rainer
5
如果输入是一个数组,我总是建议使用 Arrays.stream。也就是说,在没有真正的可变参数调用时应该使用它,这样可以清楚地表明我们正在流式处理一个数组,并且对于基本类型的数组将能够正确工作,而不是创建一个单一元素流。对于这种特定情况,两者都会产生相同的结果。 - Holger
@Holger:是的,这不是一个坏主意,尽管自Java 5以来,一些以前接受数组参数的API现在接受varargs参数,因此这种区别可能不是永恒的... - Lukas Eder
2
在Java 5引入varargs时进行了一次改进,但这不是经常发生的事情。而且,将Arrays.asList作为varargs方法被认为是一个设计错误,因为它与创建一个现有数组的包装器的目的相矛盾(例如,通过返回的List可以修改数组)。Java 9将修复这个问题。在那里,您可以使用List.of(…)创建任意大小的不可变列表(真正的varargs语义),并使用Arrays.asList(array)将数组包装在可变的List中(由于兼容性约束仍然是varargs)。 - Holger

3

首先,将字符串拆分为单独的数字,然后将这些数字(仍然是字符串)转换为实际的整数,并最终将它们收集到一个列表中。您可以通过链接流操作来完成所有这些操作。

String ints = "1, 2, 3";
List<Integer> intList = Stream
        .of(ints.split(", "))
        .map(Integer::valueOf)
        .collect(Collectors.toList());
System.out.println(intList);  // [1, 2, 3]

2
你可以使用数组函数asList,然后按照java8的方式进行转换。
不要忘记删除空格。
 List<Integer> erg = Arrays.asList(ints.replace(" ", "").split(",")).stream().map(Integer::parseInt).collect(Collectors.toList());

编辑: 抱歉,我没有看到它是一个单独的字符串,以为它是一个String数组。


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