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)
你不需要\xe2\x80\x99t需要>>FileInputStream绕道来获得行流。即使你需要一个,还有\xe2\x80\x99sInputStreamReaderBufferedReaderBufferedReaderFiles.newBufferedReader
forEachDon\xe2\x80\x99t 操作;中的现有集合 如果你又回到那个状态,你最好继续使用普通的循环。对于 Stream\xe2\x80\x99s,需要flatMap处理嵌套项目,例如一行中的标记
标记本身可以使用简单的正则表达式进行过滤,[0-9]+这意味着必须至少有一个数字,这也可以对空字符串进行排序,但是使用" *"作为分割模式而不是" ",甚至不会首先创建空字符串。null分割操作永远不会发生
\xe2\x80\xa6
\n\nList<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}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
5041 次 |
| 最近记录: |