构造函数作为高阶函数



我面临的问题是,我想从流4元素映射到记录的构造器数据:

record Data(String firstname, String middlename, String lastname, String zip) {}
Function4<String, String, String, String, Data> constructor = Data::new;
List<Data> data = Stream.of("chris", "p", "bacon", "black")
.map(constructor)
.collect(Collectors.toList())

我找到了一个匹配的高阶函数(来自vavr的Function4(来描述这个至少有4个参数的构造函数。但是我不知道在这种情况下该怎么用。

旁注:我试图避免的是构建一个由4个元素组成的CCD_ 2;"手动":

List<Data> datas = rowData.stream()
.map(row -> new Data(row.get(0), row.get(1), row.get(2), row.get(3))).toList();

我认为在Java中无法做到这一点,因为在流中的某个时刻,我必须构造一个参数为arity 4的类型。

您的想法接近Applicative Functor,它已经在任何一元库中实现,vavr也实现了它,但有一个限制:您最多可以有8个arities。要解决您的问题,您必须遵循以下步骤:

  • 将您的每一个参数提升到Monadic世界
  • 使用应用Functor完成其余操作
// Validation is a monad, you lift your param here
Validation<String,String> firstname = Validation.valid("chris");
Validation<String,String> middlename = Validation.valid("p");
Validation<String,String> lastname = Validation.valid("lastname");
Validation<String,String> zip = Validation.valid("zip");
// Here is the limitation of vavr, only Validation implement applicative functor so you can only Validation class
// to combine four field to Data object. Beside you have to handle the error -> all the error is collected in 
// the left side Seq<String>
Validation<Seq<String>, Data> result = Validation.combine(firstname, middlename, lastname, zip).ap(Data::new);

最新更新