【问题标题】:Getting an error while trying to map a list of objects尝试映射对象列表时出错
【发布时间】:2022-02-08 02:31:54
【问题描述】:

我正在尝试映射此列表:

mappedCustomers = customers.stream().map(e ->e.setLastName("e")).collect(Collectors.toList());

客户类别

@Entity

@Table(name = "客户") 公共类客户{

@Id
@GeneratedValue
Long id;

String firstName;

String lastName;

public Long getId() {
    return id;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

}

但我收到此错误:

不存在类型变量 R 的实例,因此 void 符合 R

【问题讨论】:

  • 给出变量的类型和至少客户类别。
  • 您的方法返回 void 但 map 需要一些返回值,如果您想使用 setter,请考虑使用 forEach。

标签: java list stream


【解决方案1】:

来自 Stream API 的 Map 函数,需要一个返回值的函数。

<R> Stream<R> map(Function<? super T,? extends R> mapper)

但是 setter 返回值是 void(根本没有返回值),因此您的代码不符合 map 方法签名,如果您想遍历集合并执行可以使用 forEach 的操作

void forEach(Consumer<? super T> action)

无需进行收集,因为您的初始收集将是相同的,但它会包含您的修改。

customers.stream().forEach(x -> x.setLastName("e"))

【讨论】:

    【解决方案2】:

    map() 返回一个新流,因此您可以根据需要链接另一个操作。然后,collect() 返回一个新列表。但是由于你只调用了一个 setter,你最终会得到两个包含相同对象的列表。在这种情况下,forEach() 会更简单。

    customers.stream().forEach(e -> e.setLastName("e"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 2022-01-13
      • 2019-11-20
      • 1970-01-01
      • 2021-12-22
      • 2021-09-27
      • 1970-01-01
      相关资源
      最近更新 更多