Java 8-如何将数组列表转换为特定类对象的列表

Java 8-如何将数组列表转换为特定类对象的列表,java,arrays,java-8,lambda,java-stream,Java,Arrays,Java 8,Lambda,Java Stream,使用Java8流包,我想将object类型的数组列表转换为特定类对象的列表。第一个列表上的数组包含从数据库加载的类的字段 这是从数据库加载的object类型的数组列表: List<Object[]> results = loadFromDB(); 正如您可以看到原始列表中存在的每个元素Object[]结果它只是对象的数组表示形式偏差风险 现在,我知道如何使用循环来实现这一点,只需3行代码,如下所示: List<DeviationRisk> deviations =

使用Java8流包,我想将object类型的数组列表转换为特定类对象的列表。第一个列表上的数组包含从数据库加载的类的字段

这是从数据库加载的object类型的数组列表:

List<Object[]> results = loadFromDB();
正如您可以看到原始列表中存在的每个元素
Object[]
结果它只是对象的数组表示形式
偏差风险

现在,我知道如何使用循环来实现这一点,只需3行代码,如下所示:

  List<DeviationRisk> deviations = new ArrayList<>();
        for (Object[] res : results) {
            deviations.add(new DeviationRisk(res));
        }
列表偏差=新建ArrayList();
对于(对象[]res:results){
偏差。添加(新偏差风险(res));
}
如何使用Java 8流实现相同的结果?

您可以尝试:

List<DeviationRisk> result = results.stream()
                                    .map(DeviationRisk::new)
                                    .collect(Collectors.toList())
List result=results.stream()
.map(偏差风险::新建)
.collect(收集器.toList())
这样就可以了:

final List<DeviationRisk> l = results.stream()
    .map(DeviationRisk::new).collect(Collectors.toList());
final List l=results.stream()
.map(偏差风险::新建).collect(收集器.toList());

这项工作是因为
偏差风险::new
被编译器视为一个
函数。

简短而聪明的答案+1。干杯:)我错过了对new的调用。@kocko你能解释一下它的映射部分吗。当你说DeviationRisk::new时会发生什么。我知道这是一个构造函数引用,但我不知道当map方法被传递一个构造函数引用时,它内部会发生什么。我能得到你关于转换问题的建议吗?与上面的答案相同,所以你也应该得到+1:)@fge你能解释一下它的map部分吗。当你说DeviationRisk::new时会发生什么。我知道这是一个构造函数引用,但我无法理解当map方法被传递构造函数引用时,它内部会发生什么。@bot正如我所解释的,这是由于
DeviationRisk::new
在编译器级别被视为
函数
。重要的是参数类型(
Object[]
)和返回类型
DeviationRisk
。在这种情况下,请忘记这是一个构造函数;编译器能够推断这样一个事实:如果您最终将
对象[]
传递给lambda,结果将是
偏差风险。这个特殊的lambda实际上是一个对构造函数的方法引用,这一点都不重要——它可以是任何其他解释。我特别想知道的是map方法是如何使用这个lambda的。例如,考虑一下。map(Apple:new)被分配给字符串列表,Apple类包含一个初始化name实例变量的构造函数。map方法如何知道它必须使用Apple的名称作为lambda的输入,而不是Apple中任何其他String类型的实例变量。在当前示例中,如果偏差风险有两个Object[]类型的实例变量,该怎么办?lambda如何知道使用哪一个作为输入?
final List<DeviationRisk> l = results.stream()
    .map(DeviationRisk::new).collect(Collectors.toList());