2016-08-30 51 views
2

在Java中定制对象的列表,所以我有这样的事情:转换字符串列表使用Lambda表达式

List<String> persons = Arrays.asList("Tom","Harry", "Steve"); 

我想用Lambda表达式将其转换为一个List<Person>

假设人是下面的类:

class Person { 
    private String name; 
    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return this.name; 
    } 
} 

我一直在尝试不同的东西用foreach,地图等,但没能获得该代码工作。

谢谢。

+0

我已经看到了前面。这不是一个重复的问题。这是一个不同的场景,因为Person是不能改变的第三方类。所以,我会需要建立lambda的建议。 – Partha

回答

3

如果添加一个构造函数,你Person类需要一个字符串,你可以使用:

List<Person> people = persons.stream() 
    .map(Person::new) 
    .collect(Collectors.toList()); 

如果你没有一个构造函数,那么您将需要一个lambda:

List<Person> people = persons.stream() 
    .map(s -> { Person p = new Person(); p.setName(s); return p; }) 
    .collect(Collectors.toList()); 
+0

完美!这工作,非常感谢:) – Partha

1

首先比较好的是你修改你的类Person,添加另一个传递名字的构造函数。

public class Person { 
    public Person() {} 
    public Person(String name) { this.name = name; } 
    private String name; 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getName() { 
     return this.name; 
    } 
} 

之后,只需要执行此代码:

List<String> persons = Arrays.asList("Tom","Harry", "Steve"); 
List<Person> result = persons 
     .stream() 
     .filter(name -> name != null) // logical expression to remove invalid elements of the result collection 
     .map(name -> new Person(name)) 
     .collect(Collectors.toList()); 
+0

其实,我不能改变人。把它看作是第三方供应商提供的东西。但是,谢谢,我会为其他一些用例保留这些知识。 – Partha

+0

但是,如果你不能修改'Person'类,你必须编写更多的代码 –

+0

我认为,如果'null'作为一个值提供,它不应该从列表中删除,除非方法调用者正在期待这种行为。把这种逻辑放在流中也是不合适的。空检查应该由'Person'类来完成,假设'null'首先是'Person'的无效名称。 – 4castle