【问题标题】:Java 8 convert String of ints to List<Integer>Java 8 将整数字符串转换为 List<Integer>
【发布时间】:2017-04-13 15:42:49
【问题描述】:

我有一个字符串:

String ints = "1, 2, 3";

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

List<Integer> intList

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

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

但不是整数列表。

有什么想法吗?

【问题讨论】:

  • 您的最后一行代码将为您提供一个列表,其中只有一个字符串,其值为"1, 2, 3"。您的意思是:Stream.of("1", "2", "3")

标签: java java-8 java-stream collectors


【解决方案1】:

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

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

【讨论】:

  • 是的,但是他特意要求用Java8的方式来解决这个问题
  • 这不会创建 List
  • 如果输入是一个数组,即没有真正的可变参数调用时,我总是建议使用Arrays.stream。这清楚地表明我们在一个数组上进行流式传输,并且可以对原始类型的数组正常工作,而不是创建单个元素流。对于这种特定情况,两者都会做同样的事情。
  • @Holger:是的,这不是一个坏主意,尽管从 Java 5 开始,一些过去采用数组参数的 API 现在采用 varargs 参数,所以这种区别可能不是永恒的......
  • 在 Java 5 中引入可变参数时进行了改造,但这种情况不会经常再次发生。而且,将Arrays.asList 设为可变参数方法已被视为设计错误,因为它与围绕现有 数组创建包装器的目的相矛盾(例如,可以通过返回的List 修改数组) . Java 9 将解决这个问题。在那里,您可以使用List.of(…) 创建任意大小的不可变列表(真正的可变参数语义),并使用Arrays.asList(array) 将数组包装在可变List 中(由于兼容性限制,仍然是可变参数)。
【解决方案2】:

您需要拆分字符串并从每个部分中创建一个 Stream。 splitAsStream(input) 方法正是这样做的:

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

它返回输入字符串部分的Stream&lt;String&gt;,您可以稍后将其映射到Integer 并收集到一个列表中。

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

【讨论】:

  • @Igor 真的没有赢家,只是完成任务的不同解决方案。创建一个数组并将其传递给 Stream.of 也可以,并且取决于您要解析的字符串和确切的分隔符(如果不是", "),也许splitAsStream 的这个解决方案会比另一个。这需要衡量。
  • 我更喜欢这个而不是我的。不知道Pattern.splitAsStream() 方法。太棒了!
  • 您可以使用Pattern.compile(", ", Pattern.LITERAL); 向引擎提示没有真正的模式匹配。当然,引擎会在没有标志的情况下发现自己,但指定标志会跳过分析模式的过程。
【解决方案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]

【讨论】:

    【解决方案4】:

    你可以只使用数组函数asList,然后用java8的方式转换。

    不要忘记删除空格。

     List<Integer> erg = Arrays.asList(ints.replace(" ", "").split(",")).stream().map(Integer::parseInt).collect(Collectors.toList());
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 2023-03-26
      • 2017-08-30
      • 1970-01-01
      相关资源
      最近更新 更多