【问题标题】:Cannot resolve constructor in Java 8无法解析 Java 8 中的构造函数
【发布时间】:2019-06-12 12:03:11
【问题描述】:

我想创建一个克隆列表。我正在使用以下代码 sn-p,但我的 IDE 显示编译错误为“无法解析构造函数”,即使 MyClass 具有默认构造函数。

List<MyClass> clonedList = 
    myClassList.stream().map(MyClass::new).collect(Collectors.toList());

我是流的新手,如果我的语法错误,请帮助我。

【问题讨论】:

  • myClassList 包含什么?
  • 它是一个 MyClass 对象列表
  • 好的。这应该是只有相同类型参数的空构造函数吗?
  • 不能为空。您实际上必须将代码放入其中,将给定对象中的字段复制到新对象,并在需要时处理任何深层副本。

标签: java collections java-8 java-stream


【解决方案1】:

MyClass::new 只有在你的类有一个构造函数,该构造函数接受一个参数,其类型是Stream 的元素的类型时,才会在这种情况下工作。无参数构造函数不起作用。

myClassList.stream().map(MyClass::new)...

表现得像

myClassList.stream().map(e -> new MyClass(e))...

由于myClassListMyClass 实例的列表,这意味着需要具有以下签名的构造函数才能使方法引用工作 - MyClass (MyClass other)

您仍然可以将无参数构造函数与以下 lambda 表达式一起使用:

myClassList.stream().map(e -> new MyClass())...

当然,这没什么意义,因为它忽略了Stream 的原始元素。

由于您的目标是克隆List,因此您需要一个复制构造函数:

public MyClass (MyClass other) {
    // copy the properties of other to this instance
}

【讨论】:

  • 我还是一头雾水。我的问题是如何使用流获取克隆列表。示例我有 List 我想使用流创建此列表的克隆副本。我知道如何编写代码来进行深度克隆,但我想知道是否有一些流可以在不使用复制构造函数的情况下实现深度克隆
  • @Rohit 一旦您将建议的复制构造函数添加到您的类中,您的问题中的 Stream 管道就会起作用。
  • @Rohit 要么你有一个复制构造函数或一个克隆方法。 Stream API 中没有任何魔法允许克隆不可克隆。
猜你喜欢
  • 2015-05-29
  • 1970-01-01
  • 2015-05-05
  • 2017-02-28
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多