Lambda将文件输入到数组中

时间:2015-02-15 22:22:29

标签: java lambda java-8

我正处于工作的最后一部分,我遇到了麻烦。我需要使用InputData类的stream方法将下面的代码转换为Lambda语句,以及与当前循环具有相同效果的forEach循环。对于stream方法,我考虑使用... inputData.stream()。forEach(values - > ....就在try块中,但是我无法弄清楚forEach循环的其余语法。有人能指出我正确的方向吗?谢谢!

private List<AreaData> readInput(String filename) throws IllegalStateException,
        NumberFormatException
{
    /* This statement uses the "diamond" operator, since it is possible for
       the compiler to work out the required generic type. */
    final List<AreaData> result = new LinkedList<>();
    try( InputData inputData =
            new InputData(filename, InputData.class, null,
                    Field.values().length, ",") )
    {
        /* Iterate through each of the lines of values. */
        for( String[] values : inputData )
        {
            /* Create a new AreaData object, and add it to the list. */
            AreaData next = new AreaData(values);

            result.add(next);
        }
    }
    return result;
}

1 个答案:

答案 0 :(得分:2)

假设inputData.stream()返回Stream<String[]>,您可以使用Stream上的地图操作来实现此目的,而不是forEach方法。 mapper函数将以String[]作为参数,并返回一个新的AreaData实例(您可以使用构造函数引用来缩短它)。这就是代码在使用map操作时的样子:

private List<AreaData> readInput(String filename)  throws IllegalStateException, NumberFormatException {
    try(InputData inputData = new InputData(filename, 
                                            InputData.class, 
                                            null, 
                                            Field.values().length, ",")) {
        return inputData.stream().map(AreaData::new).collect(Collectors.toList());
    }
}

<小时/> 如果你必须使用forEach方法,你基本上要做的就是那个;对于String实例中的每个inputData数组,创建一个新的AreaData实例并将其添加到列表中(因此lambda将为values -> result.add ...)。不过我觉得这种方法有点奇怪。在我看来,地图操作是你应该在这里做的,因为它实际上是从新AreaData实例到每个数组的映射。