在Stream消费后使用构造函数

时间:2017-06-23 17:32:02

标签: 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 MyClass(
    IntStream.range(0, column.length).mapToDouble(i->modify(column[i])).toArray()
  );

1 个答案:

答案 0 :(得分:1)

如果你的构造函数保持原样:public MyClass(double[] column),我担心你做得比你做的更好。

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

public MyClass(List<Double> column)

然后你可以这样做:

MyClass myClass = IntStream.range(0, column.length)
    .mapToObj(i -> modify(column[i]))
    .collect(Collectors.collectingAndThen(
        Collectors.toList(),
        MyClass::new));

这使用Collectors.collectingAndThen,它接受​​收集器,然后使用结果作为给定函数的输入。在这种情况下,我们首先将Double值收集到List,然后使用对MyClass的构造函数的引用作为函数(构造函数可以看作是接收a的函数) List<Double>作为参数并返回MyClass)的实例。

免责声明:我不会仅仅为了代码风格而进行所有这些更改。数组更快,可以保存原始值,而List只能保存对象。如果在MyClass类中有一个列表而不是一个数组,我只会选择此选项。