过滤字符串列表中的非整数

Dev*_*Dev 3 java-8 java-stream

我正在读取一个文件并形成一个整数列表。

示例文件:

1 1 2 3 4
2 2 5 abc

4 2 8
Run Code Online (Sandbox Code Playgroud)

运行以下代码时会失败,因为“abc”无法转换为整数。

您能否让我知道是否可以在 Java 8 中以更清晰的方式过滤掉非整数字段,例如:使用过滤器?

try (BufferedReader br = new BufferedReader(new InputStreamReader(
        new FileInputStream(file)))) {

     List<Integer> allValues = new ArrayList<>();       
      br.lines().forEach(
          strLine -> {
            List<String> wordsList = Arrays.asList(strLine.trim().split(" "));
            List<Integer> routes = wordsList.stream()
                .filter(e -> e != null && !e.isEmpty())
                .map(Integer::valueOf)
                .collect(Collectors.toList());
            allValues.addAll(routes);
          });

      allValues.forEach(str -> System.out.print(str));
    }
Run Code Online (Sandbox Code Playgroud)

Hol*_*ger 5

    \n
  • 你不需要\xe2\x80\x99t需要>>FileInputStream绕道来获得行流。即使你需要一个,还有\xe2\x80\x99sInputStreamReaderBufferedReaderBufferedReaderFiles.newBufferedReader

  • \n
  • forEachDon\xe2\x80\x99t 操作;中的现有集合 如果你又回到那个状态,你最好继续使用普通的循环。对于 Stream\xe2\x80\x99s,需要flatMap处理嵌套项目,例如一行中的标记

  • \n
  • 标记本身可以使用简单的正则表达式进行过滤,[0-9]+这意味着必须至少有一个数字,这也可以对空字符串进行排序,但是使用" *"作为分割模式而不是" ",甚至不会首先创建空字符串。null分割操作永远不会发生

  • \n
\n\n

\xe2\x80\xa6

\n\n
List<Integer> allValues;\ntry(Stream<String> lines=Files.lines(file.toPath())) {\n    allValues=lines.flatMap(Pattern.compile(" *")::splitAsStream)\n         .filter(s -> s.matches("[0-9]+"))\n         .map(Integer::valueOf)\n         .collect(Collectors.toList());\n}\n
Run Code Online (Sandbox Code Playgroud)\n