使用Lambda函数将一组字符串转换为一组对象

问题描述 投票:0回答:1

我是Java Lambda函数的新手,所以问题可能很简单。

我有一个实体类并使用Lombok:

@Entity
@Data
public class Product {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;
  private String name;
  
  // getter & setters
  ...

}

然后,我得到了一个

Set<String> data
,其中的每个元素代表了一个
Product
的名称。现在我想把这个
data
变成
Set<Product> prodcts
。我尝试了两件事:

  1. 我首先尝试使用
    Product
    的构造函数:
Set<String> data = getData();

//Compiler error:reason: no instance(s) of type variable(s) exist so that String conforms to Product
var products = data.stream().map(Product::new)

但我不确定如何使用此 Lambda 语法将参数传递给构造函数,并且还会出现编译器错误,如代码中所示。

  1. 然后,我尝试直接调用该方法:
Set<String> data = getData();

//Compiler error: Incompatible types: expected not void but compile-time declaration for the method reference has void return type
var products = data.stream().map(Product::setName)

但是我收到编译器错误

Incompatible types: expected not void but compile-time declaration for the method reference has void return type

那么使用 Lambda 函数进行此转换的正确方法是什么?

java lambda java-11
1个回答
1
投票

对于

data
集合中的每个元素,您可以创建一个新产品并设置其
name
并将生成的流收集为
Set<Product>

Set<Product> products = data.stream()
        .map(name -> {
            Product product = new Product();
            product.setName(name);
            return product;
        })
        .collect(Collectors.toSet());

如果 Product 类中有一个构造函数接受产品名称,例如,

public static class Product {
    int id;
    String name;
        
    public Product(String name) {
        this.name = name;
    }

    // getter & setters
}

然后您可以通过方法参考来简化 map 步骤。

 Set<Product> products = data.stream()
        .map(Product::new)
        .collect(Collectors.toSet());
© www.soinside.com 2019 - 2024. All rights reserved.