尝试将List <String>转换为List <Integer>

时间:2019-10-21 19:28:01

标签: java list methods integer java-stream

我目前正在尝试使用流等将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)

2 个答案:

答案 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<>();
}