有没有一个Java 8的方式来做到以下几点?Java 8将自定义元素添加到集合的方式?
for(int i;i<=100;i++){
Person person=new Person();
person.setId(i);
person.setName("name"+i);
list.add(person)
}
有没有一个Java 8的方式来做到以下几点?Java 8将自定义元素添加到集合的方式?
for(int i;i<=100;i++){
Person person=new Person();
person.setId(i);
person.setName("name"+i);
list.add(person)
}
是:
IntStream.rangeClosed(0, 100)
.forEach(i -> {
Person person=new Person();
person.setId(i);
person.setName("name"+i);
list.add(person);
});
编辑:
如下面评论的,访问所述流操作的lambda表达式参数内现有列表违背功能编程。最好是:
List<Person> persons = IntStream.rangeClosed(0, 100)
.mapToObj(i -> {
Person person=new Person();
person.setId(i);
person.setName("name" + i);
return person;
})
.collect(Collectors.toList());
请参阅https://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html。
这不会编译。使用'forEach'可能不是一个好主意:在这种情况下使用它是不鼓励的。例如,如果你并行运行它,你会对结果感到惊讶。 – Tunaki
是的,它不编译与foreach,我试着编辑答案,但不能。使用forEach的任何具体缺点? – user68883
道歉,因为我现在无法访问编译器...... @Tunaki是对的。你应该避免有状态的lambda表达式[特别是当做并行的东西时](https://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html#stateful_lambda_expressions)。这种简单的方法只有在流操作是串行的情况下才能被接受。 – manouti
您可以通过将每个int
从0到100映射到Person
来获取人员列表。
List<Person> persons = IntStream.rangeClosed(0, 100).mapToObj(i -> {
Person person = new Person();
person.setId(i);
person.setName("name" + i);
return person;
}).collect(Collectors.toList());
然后,您可以添加该persons
列表到一个现有的例子。
IntStream.rangeClosed
返回原始int
的IntStream
。每个映射到对象Person
与mapToObj
并收集到列表Collectors.toList()
。
如果你有一个构造函数Person
,它将会更清洁,并带有id和名字。有了这样的构造函数,你可以这样写:
List<Person> persons = IntStream.rangeClosed(0, 100)
.mapToObj(i -> new Person(i, "name" + i))
.collect(Collectors.toList());
你想添加元素到已经存在的列表,还是我们可以创建并返回新的列表?像'new Person(id,name)'这样的构造函数是否存在? – Pshemo