我正处于工作的最后一部分,我遇到了麻烦。我需要使用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;
}
答案 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
实例到每个数组的映射。