如何将 Iterable<T> 映射到它的 DTO?

How to map Iterable<T> to its DTO?

我有以下存储库:

PermissionRepository:

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

}

在我的服务中,我试图将 Permission 实体映射到 PermissionDTO,但是作为 findAll() 方法 returns Iterable<T> (Iterable<T> findAll();), 我不能像下面显示的那样转换,因为我通常使用 List<T>。它为 .stream() 方法抛出“无法解析 'Iterable' 中的方法 'stream'”错误。

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

那么,我怎样才能将这个 Permission 实体映射到 PermissionDTO

有 3 种方法可以满足您的需求

覆盖 findAll 并使其 return 成为 List

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

实施 JpaRepository 而不是 CrudRepository

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

使用 StreamSupport.

Iterable 转换为 Stream
StreamSupport.stream(iterable.spliterator(), false).map(PermissionDTO::new)
    .collect(Collectors.toList());