【问题标题】:Converting a List of Strings to a List of custom made objects in Java using Lambda Expression [duplicate]使用 Lambda 表达式将字符串列表转换为 Java 中的自定义对象列表 [重复]
【发布时间】:2017-01-07 09:30:46
【问题描述】:

所以我有这样的东西:

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

我想使用 Lambda 表达式将其转换为 List&lt;Person&gt;

假设 Person 是以下类:

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

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

我一直在尝试使用 forEach、map 等进行各种操作,但无法让代码正常工作。

谢谢。

【问题讨论】:

  • 我之前已经看到了。这不是一个重复的问题。这是一个不同的场景,因为 Person 是无法更改的第 3 方类。所以,我需要创建 lambda 的建议。

标签: java lambda java-8 java-stream


【解决方案1】:

如果你向你的 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());

【讨论】:

  • 完美!!这行得通,非常感谢:)
【解决方案2】:

首先最好修改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());

【讨论】:

  • 实际上,我无法更改 Person。将其视为由第 3 方供应商提供的东西。但是谢谢,我会将这些知识留给其他用例。
  • 但是如果你不能修改Person类你就得多写一点代码
  • 我认为,如果null 作为值提供,则不应将其从列表中静默删除,除非方法调用者期望该行为。将该逻辑放入流中也是不合适的。空值检查应该由Person 类完成,假设null 首先是Person 的无效名称。
  • @4castle 一切都取决于你想做什么,这段代码只是我们可以用流做的一个例子,它可以是任何逻辑表达式。
猜你喜欢
  • 2013-06-16
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 2020-04-28
  • 1970-01-01
相关资源
最近更新 更多