Java Lambda输入文件到数组中
我的任务已经到了最后阶段,遇到了一个难题。我需要使用InputData类的stream方法将下面的代码转换为Lambda语句,以及与当前循环具有相同效果的forEach循环。对于流方法,我正在考虑使用。。。inputData.stream().forEach(值->..就在try块内,但我无法理解forEach循环的其余语法。有人能告诉我正确的方向吗?谢谢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
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:你讲的是矛盾的事情。要么你的任务是使用流,要么你的任务是使用循环。同时使用循环和流是没有意义的。