Java 8将int的int转换为List <Integer>

Igo*_*gor 14 java java-8 java-stream collectors

我有一个字符串:

String ints = "1, 2, 3";
Run Code Online (Sandbox Code Playgroud)

我想将其转换为整数列表:

List<Integer> intList
Run Code Online (Sandbox Code Playgroud)

我可以通过这种方式将其转换为字符串列表:

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

但不要列出整数.

有任何想法吗?

Tun*_*aki 23

您需要拆分字符串并从每个部分中生成一个Stream.该方法splitAsStream(input)正是如此:

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

它返回Stream<String>输入字符串的一部分,稍后您可以将其映射到a Integer并收集到列表中.

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

  • 您可以使用`Pattern.compile(",",Pattern.LITERAL);`来提示引擎没有真正的模式匹配.当然,引擎会在没有标志的情况下发现自己,但是指定标志会跳过分析模式的过程. (6认同)
  • 我更喜欢这个比我的.不知道`Pattern.splitAsStream()`方法.优秀! (5认同)
  • @Igor真的没有赢家,只有不同的解决方案来完成任务.创建一个数组并将其传递给Stream.of也可以,并且根据你要解析的字符串和确切的分隔符(如果它不是`","`),也许这个带有`splitAsStream`的解决方案将是比另一个快.这需要衡量. (2认同)

Luk*_*der 19

正则表达式拆分是您正在寻找的

Stream.of(ints.split(", "))
      .map(Integer::parseInt)
      .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • 如果输入是一个数组,即没有真正的varargs调用,我总是建议使用`Arrays.stream`.这清楚地表明我们流式传输数组并且可以正确地处理基本类型的数组,而不是创建单个元素流.对于这种特定情况,两者都会这样做. (5认同)
  • 在使用Java 5引入varargs时进行了改进,但这并不是经常发生的事情.并且,使'Arrays.asList`成为一个varargs方法被认为是一个设计错误,因为它与在*existing*数组周围创建包装器的目的相矛盾(例如,可以通过返回的`List`修改数组).Java 9将解决这个问题.在那里,你可以使用`List.of(...)`来创建任意大小的不可变列表(真正的varargs语义)和`Arrays.asList(array)`来将数组包装在一个可变的`List`中(仍然是varargs到期兼容性约束). (2认同)