我的代码读入people.txt
,构造了许多人物对象并将其添加到人员列表中。
但是如果我删除forEach,则不会执行stream.map()函数,因为它是一个中间函数,因此我需要forEach或任何其他最终函数。
但是,我不希望在forEach函数中执行任何Consumer lambda(在本例中为print语句)。我该怎么做?
我的主要方法:
public static void main(String[] args) {
List<Person> persons=new ArrayList<>();
try(
BufferedReader reader=
new BufferedReader(
new InputStreamReader(
Main.class.getResourceAsStream("people.txt")));
Stream<String> stream=reader.lines();
){
stream.map(line->{
String[] s=line.split(" ");
Person p=new Person(
s[0].trim(),
Integer.parseInt(s[1]),
s[2].trim()
);
persons.add(p);
return p;
}).forEach(System.out::print);
}catch(IOException e){
System.out.println(e);
}
答案 0 :(得分:1)
List<Person> persons = stream.map(line->{
String[] s=line.split(" ");
Person p=new Person(
s[0].trim(),
Integer.parseInt(s[1]),
s[2].trim()
}).collect(Collectors.toList());
如果您想使用自定义列表而不是.collect(Collectors.toCollection(persons))
答案 1 :(得分:0)
如果您不打算收集它,您不必映射任何内容。 通过将它们添加到列表中,您已经在使用它们,因此您可以执行以下操作:
stream.forEach(line->{
String[] s=line.split(" ");
Person p=new Person(
s[0].trim(),
Integer.parseInt(s[1]),
s[2].trim()
);
persons.add(p);
})
这样你仍然可以填写清单。 此外,你可以做的是
stream.map(line->{
String[] s=line.split(" ");
Person p=new Person(
s[0].trim(),
Integer.parseInt(s[1]),
s[2].trim()
);
return p;
}).forEach(persons::add);
另外,你不应该在你的地图功能中做任何副作用,这会给列表添加一些东西。 map()应仅用于将内容映射到流,向列表添加内容是消费它的方式。如果这是您向人员列表添加内容的唯一地方,您也可以执行以下操作:
persons = stream.map(line->{
String[] s=line.split(" ");
Person p=new Person(
s[0].trim(),
Integer.parseInt(s[1]),
s[2].trim()
);
return p;
}).collect(Collectors.toList());
答案 2 :(得分:0)
使用唯一Stream API的更紧凑的解决方案:
try (BufferedReader reader = new BufferedReader(new InputStreamReader(
Main.class.getResourceAsStream("people.txt")))) {
List<Person> peoples = reader.lines()
.map(line -> line.split(" "))
.map(tuple -> new Person(
tuple[0].trim(),
Integer.parseInt(tuple[1]),
tuple[2].trim()
))
.collect(Collectors.toList());
peoples.forEach(System.out::println);
} catch (IOException e) {
System.out.println(e);
}