我目前正在尝试使用流等将List<String>
转换为List<Integer>
。但是我不知道发生了什么。当它运行时,它给了我一些让我发狂的错误。
我已经尝试过(很少)从Java Streams中了解的所有内容,也尝试不使用它们,但是我想以一种实用的方式来实现它。
我给我的方法(leeFichero)一个字符串f,它只是我的txt文件的路径。我想要的方法是返回一个List<Integer>
,其中包含值。
该文件的内容是这样的:
-3,-2,-1,0,1,2,3 1,3,5,7,9 100 2,4,6,8,10
public static List<Integer> leeFichero(String f) {
List<String>lineas=null;
try {
BufferedReader bf = new BufferedReader(new FileReader(f));
lineas = bf.lines().collect(Collectors.toList());
bf.close();
} catch (IOException e) {
System.out.println(e.toString());
}
List<Integer> intList = lineas.stream().map(s -> Integer.parseInt(s)).collect(Collectors.toList());
return intList;
}
当我运行它时,它会显示以下错误消息:
Exception in thread "main" java.lang.NumberFormatException: For input string: "-3,-2,-1,0,1,2,3"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.base/java.lang.Integer.parseInt(Integer.java:652)
at java.base/java.lang.Integer.parseInt(Integer.java:770)
at ejercicios.ejercicio1.lambda$0(ejercicio1.java:108)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1654)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
at ejercicios.ejercicio1.leeFichero(ejercicio1.java:108)
at ejercicios.ejercicio1.main(ejercicio1.java:48)
答案 0 :(得分:5)
您应该split
的{{1}}行使用String
和,
这些行收集为列表。
flatMap
然后返回映射为的lineas = bf.lines()
.flatMap(s -> Arrays.stream(s.split(",")))
.collect(Collectors.toList());
:
List<Integer>
答案 1 :(得分:1)
首先,我看不到您的方法中许多临时变量的用途。其次,我希望使用编译后的Pattern
来分割行(此处\\s*
用于消耗数字和逗号之间的任何空格)。首选try-with-Resources
而不是手动资源管理。然后,正如已经指出的那样,先使用flapMap()
然后使用map()
-但我只是直接返回结果。像
public static List<Integer> leeFichero(String f) {
Pattern p = Pattern.compile("\\s*,\\s*");
try (BufferedReader bf = new BufferedReader(new FileReader(f))) {
return bf.lines().flatMap(s -> Arrays.stream(p.split(s)))
.map(Integer::valueOf).collect(Collectors.toList());
} catch (IOException e) {
System.out.println(e.toString());
}
return new ArrayList<>();
}