Java 在流消耗之后使用构造函数

Java 在流消耗之后使用构造函数,java,java-stream,Java,Java Stream,假设我有一个带有这个构造函数的类MyClass public MyClass(double[] column){ //... } 有可能写出这样的东西吗 MyClass myClass=IntStream .range(0, column.length) .mapToDouble(i->modify(column[i])) .instantiateFromArray(MyClass::new); 而不是 MyClass myClass=new MyClas

假设我有一个带有这个构造函数的类MyClass

public MyClass(double[] column){
   //...
}
有可能写出这样的东西吗

MyClass myClass=IntStream
    .range(0, column.length)
    .mapToDouble(i->modify(column[i]))
    .instantiateFromArray(MyClass::new);
而不是

MyClass myClass=new MyClass(
    IntStream.range(0, column.length).mapToDouble(i->modify(column[i])).toArray()
  );

如果您的构造函数保持原样:
publicmyclass(double[]列)
,恐怕您做得再好不过了

另一方面,如果您可以将构造函数更改为:

public MyClass(List<Double> column)
它使用,它接受一个收集器,然后使用结果作为给定函数的输入。在本例中,我们首先将
双值
收集到
列表
,然后使用对
MyClass
构造函数的引用作为函数(构造函数可以被视为一个函数,它接收
列表
作为参数,并返回
MyClass
的实例)


免责声明:我不会仅仅为了代码风格而做所有这些更改。数组速度更快,可以保存基元值,而
列表
只能保存对象。如果在
MyClass
类中使用列表而不是数组有好处,我只会选择此选项。

这样做的唯一方法是编写自己的收集器,不值得费心。基本上,问题是流不知道流中有多少元素-它是动态的,所以基本上你需要从MyClass中获取数组-创建一个具有相同值但大小为+1的新数组,并将新值放在末尾-依此类推。@sychy即使这样也没有原始流的收集器。这可以通过中的实例化扩展函数实现Kotlin@jb-nizet boxed()去营救!:)-除了笑话,谢谢:)完全忘记了:)好吧,我想最简单的方法是创建一个活动模板,因为我正在使用intellij。只需学习如何。您能否将
MyClass
的构造函数更改为接受
列表而不是
double[]
MyClass myClass = IntStream.range(0, column.length)
    .mapToObj(i -> modify(column[i]))
    .collect(Collectors.collectingAndThen(
        Collectors.toList(),
        MyClass::new));