将 List<String> 转换为 List<Integer> 仅用于有效整数

Convert List<String> to List<Integer> for only valid Integer

我正在尝试使用 Java 8 流将 List<String> 转换为 List<Integer>。但是,List<String> 中有几个 无效整数 。如何仅提取整数值,然后将 String 列表转换为 Integer 列表?

例如:

    List<Integer> intList = new ArrayList<Integer>();
    List<String> strList = new ArrayList<String>();
    String str[] = {"464 mm", "80 mm", "1000", "1220", "48 mm", "1020"};
    strList = Arrays.asList(str);
    intList.addAll(strList.stream().map(Integer::valueOf).collect(Collectors.toList()));

我遇到错误 java.lang.NumberFormatException: For input string: "464 mm"

有没有办法,我可以使用正则表达式

str.replaceAll("[^\d]", " ").trim()

提取数字然后转换。我不想使用 for 循环或 while 循环,因为这可能会影响我的代码性能。

为了从每个字符串中删除所有 non-numeric 个字符,您需要在将 String 的流转换为之前应用 map() Integer.

List<Integer> nums =
     strList.stream()
            .map(s -> s.replaceAll("[^\d]", ""))
            .map(Integer::valueOf)
            .collect(Collectors.toList());

System.out.println(nums);

输入 {"464 mm", "80 mm", "1000", "1220", "48 mm", "1020"}

[464, 80, 1000, 1220, 48, 1020]

注:

  • trim()replaceAll() 之后是多余的。
  • 由于您要将流管道生成的列表的所有内容添加到另一个列表中,因此您可以将 collect(Collectors.toList()) 替换为 toList(),后者可通过 [=50 访问=] 16 起。不同之处在于 toList() returns 一个 不可修改的列表 并且它比 collector.
  • 更高效
  • 迭代解决方案几乎总是比stream-based表现更好。 Java 中引入了 Lambda 和流,以提供一种组织代码的方式,使其更具可读性和简洁性。