【问题标题】:How to map Iterable<T> to its DTO?如何将 Iterable<T> 映射到它的 DTO?
【发布时间】:2021-12-10 18:01:21
【问题描述】:

我有以下存储库:

PermissionRepository:

public interface PermissionRepository extends CrudRepository<Permission, Long>,
        SearchRepository<Permission> {

}

在我的服务中,我试图将Permission 实体映射到PermissionDTO,但由于findAll() 方法返回Iterable&lt;T&gt; (Iterable&lt;T&gt; findAll();),我无法转换如下所示,因为我通常用于@987654328 @。它会为 .stream() 方法抛出“Cannot resolve method 'stream' in 'Iterable'”错误。

List<PermissionDTO> list = permissionRepository.findAll()
        .stream()
        .map(PermissionDTO::new)
        .collect(Collectors.toList());

那么,如何将这个Permission 实体映射到PermissionDTO

【问题讨论】:

  • 为什么不呢? ListIterable
  • 我猜你正在使用 Spring Data?用JpaRepository 代替CrudRepository 怎么样。 findAll of JpaRepository 返回一个 List
  • Convert Iterable to Stream using Java 8 JDK -> 这可能就是你要找的。​​span>
  • @RobbyCornelissen 它为.stream() 方法抛出“Cannot resolve method 'stream' in 'Iterable'”错误。
  • @magicmn 是的,这似乎是可能的,但如果有其他聪明的解决方案,一开始我不想改变那部分。

标签: java list stream iterator java-stream


【解决方案1】:

有3种方法可以做你想做的事

覆盖findAll 并使其返回List

public interface PermissionRepository extends CrudRepository<Permission, Long> {
    @Override
    List<Permission> findAll();
}

实现JpaRepository 而不是CrudRepository

public interface PermissionRepository extends JpaRepository<Permission, Long>,
    SearchRepository<Permission>

使用StreamSupportIterable 转换为Stream

StreamSupport.stream(iterable.spliterator(), false).map(PermissionDTO::new)
    .collect(Collectors.toList());

【讨论】:

  • 完美的解释和很好的答案。我认为它会解决问题,但在所有这些方法中,我都会收到警告“必需类型:函数,提供:”。有什么错误?
  • 嗯,随机猜测是 PermissionDTO::new 没有按预期工作。你的 PermissionDTO 有一个 PermissionDTO(Permission) 构造函数对吗?
  • .map(PermissionDTO::new)线有问题吗?
  • 我认为.map(PermissionDTO::new).map(permission -&gt; new PermissionDTO(permission)) 的快捷方式。这行得通吗?
  • 添加必要的构造函数解决了这个问题,非常感谢。
猜你喜欢
  • 2014-09-06
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 2019-09-26
相关资源
最近更新 更多