如何将Iterable<T>类型数据映射为其对应的DTO对象?
解决方案
这里提供4种可直接落地的实现方式,你可以根据自己的项目情况选择:
方式1:JDK原生StreamSupport转流(无额外依赖,推荐)
直接使用JDK java.util.stream 包下的StreamSupport工具类将Iterable转为Stream,不需要引入任何第三方依赖:
import java.util.stream.StreamSupport; import java.util.stream.Collectors; // 业务代码 List<PermissionDTO> list = StreamSupport.stream(permissionRepository.findAll().spliterator(), false) .map(PermissionDTO::new) .collect(Collectors.toList());
参数说明:第二个布尔值代表是否使用并行流,常规业务场景串行false即可。
方式2:重写Repository方法返回值(Spring Data原生支持,写法最简洁)
Spring Data CrudRepository支持在子接口重写父类方法修改返回值类型,你可以直接在PermissionRepository中覆写findAll方法,指定返回List<Permission>:
public interface PermissionRepository extends CrudRepository<Permission, Long>, SearchRepository<Permission> { // 新增重写方法 @Override List<Permission> findAll(); }
改完后你原来的Stream写法可以直接正常运行,不需要修改业务层逻辑。
方式3:手动遍历转换(写法最直白)
如果你不想用Stream写法,也可以直接遍历Iterable挨个转换:
List<PermissionDTO> dtoList = new ArrayList<>(); for (Permission permission : permissionRepository.findAll()) { dtoList.add(new PermissionDTO(permission)); }
方式4:借助Guava工具类转换(项目已引入Guava可选)
如果你的项目已经引入Guava库,可以先把Iterable转为List再处理:
import com.google.common.collect.Lists; List<PermissionDTO> list = Lists.newArrayList(permissionRepository.findAll()) .stream() .map(PermissionDTO::new) .collect(Collectors.toList());
内容的提问来源于stack exchange,提问作者user17188729
相关产品推荐
相关产品推荐

