我是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
。我尝试了两件事:
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 语法将参数传递给构造函数,并且还会出现编译器错误,如代码中所示。
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 函数进行此转换的正确方法是什么?
对于
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());