2016-02-19 77 views
3

有没有一个Java 8的方式来做到以下几点?Java 8将自定义元素添加到集合的方式?

for(int i;i<=100;i++){ 
    Person person=new Person(); 
    person.setId(i); 
    person.setName("name"+i); 
    list.add(person) 
} 
+3

你想添加元素到已经存在的列表,还是我们可以创建并返回新的列表?像'new Person(id,name)'这样的构造函数是否存在? – Pshemo

回答

4

是:

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

+1

这不会编译。使用'forEach'可能不是一个好主意:在这种情况下使用它是不鼓励的。例如,如果你并行运行它,你会对结果感到惊讶。 – Tunaki

+0

是的,它不编译与foreach,我试着编辑答案,但不能。使用forEach的任何具体缺点? – user68883

+1

道歉,因为我现在无法访问编译器...... @Tunaki是对的。你应该避免有状态的lambda表达式[特别是当做并行的东西时](https://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html#stateful_lambda_expressions)。这种简单的方法只有在流操作是串行的情况下才能被接受。 – manouti

7

您可以通过将每个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返回原始intIntStream。每个映射到对象PersonmapToObj并收集到列表Collectors.toList()

如果你有一个构造函数Person,它将会更清洁,并带有id和名字。有了这样的构造函数,你可以这样写:

List<Person> persons = IntStream.rangeClosed(0, 100) 
           .mapToObj(i -> new Person(i, "name" + i)) 
           .collect(Collectors.toList()); 
相关问题