Java Lambda输入文件到数组中

Java Lambda输入文件到数组中,java,lambda,java-8,Java,Lambda,Java 8,我的任务已经到了最后阶段,遇到了一个难题。我需要使用InputData类的stream方法将下面的代码转换为Lambda语句,以及与当前循环具有相同效果的forEach循环。对于流方法,我正在考虑使用。。。inputData.stream().forEach(值->..就在try块内,但我无法理解forEach循环的其余语法。有人能告诉我正确的方向吗?谢谢 private List<AreaData> readInput(String filename) throws Illegal

我的任务已经到了最后阶段,遇到了一个难题。我需要使用InputData类的stream方法将下面的代码转换为Lambda语句,以及与当前循环具有相同效果的forEach循环。对于流方法,我正在考虑使用。。。inputData.stream().forEach(值->..就在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;
}
private List readInput(字符串文件名)抛出非法状态异常,
数字格式异常
{
/*此语句使用“菱形”运算符,因为它可以
编译器将生成所需的泛型类型*/
最终列表结果=新建LinkedList();
try(输入数据输入数据=
新的InputData(文件名,InputData.class,null,
Field.values().length,“,”)
{
/*遍历每一行值*/
for(字符串[]值:inputData)
{
/*创建一个新的AreaData对象,并将其添加到列表中*/
AreaData next=新的AreaData(值);
结果。添加(下一步);
}
}
返回结果;
}

假设
inputData.stream()
返回一个
,您可以使用流上的映射操作来实现这一点,而不是使用
forEach
方法。映射器函数将以
字符串[]
作为参数,并返回一个新的
区域数据
实例(您可以使用构造函数引用来缩短它)。这是使用映射操作时代码的外观:

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());
    }
}
private List readInput(字符串文件名)引发非法状态异常、NumberFormatException{
try(InputData-InputData=newinputdata(文件名,
InputData.class,
无效的
Field.values().length,“,”){
返回inputData.stream().map(AreaData::new).collect(Collectors.toList());
}
}


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

谢谢你的回复。不幸的是,分配要求使用forEach循环。@ude76我已经编辑了我的答案;如果仍然存在unclear,让我知道。@deded76不,forEach的
只遍历元素。这是一个返回void的终端操作(注意map返回一个
(假设map是一个函数T=>U))。基本上,您应该在试用资源之前先声明列表,然后在
forEach
中添加列表中的元素。@ude76如
forEach
的文档所述:“对该流的每个元素执行操作。”因此,您的操作是为在
遍历过程中遇到的每个
字符串
数组向列表中添加一个新的
AreaData
实例。希望现在更清楚:-)@学生76:你讲的是矛盾的事情。要么你的任务是使用流,要么你的任务是使用循环。同时使用循环和流是没有意义的。