如何使用Java 8从List<Object[]>中获取数据(替代迭代)
Java 8 实现 List<Object[]> 转 List
首先你需要定义对应的MyDto类,假设它包含firstName、lastName、address三个字段,示例代码如下:
public class MyDto { private String firstName; private String lastName; private String address; // 方案一:带参构造方法 public MyDto(String firstName, String lastName, String address) { this.firstName = firstName; this.lastName = lastName; this.address = address; } // 方案二:无参构造+Setter方法 public MyDto() {} public void setFirstName(String firstName) { this.firstName = firstName; } public void setLastName(String lastName) { this.lastName = lastName; } public void setAddress(String address) { this.address = address; } // 可选:toString方法方便调试输出 @Override public String toString() { return "MyDto{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", address='" + address + '\'' + '}'; } }
接下来用Java 8的Stream API替代传统迭代写法,有几种常见实现方式:
方式一:使用带参构造方法直接映射
利用Stream.map()将每个Object[]转换为MyDto,最后通过Collectors.toList()收集为目标列表:
List<Object[]> objects = query.list(); List<MyDto> dtoList = objects.stream() // 注意类型转换,确保Object[]元素类型与Dto字段匹配 .map(obj -> new MyDto((String) obj[0], (String) obj[1], (String) obj[2])) .collect(Collectors.toList());
方式二:使用无参构造+Setter方法
如果MyDto只有无参构造,可在map()的lambda表达式中完成属性赋值:
List<MyDto> dtoList = objects.stream() .map(obj -> { MyDto dto = new MyDto(); dto.setFirstName((String) obj[0]); dto.setLastName((String) obj[1]); dto.setAddress((String) obj[2]); return dto; }) .collect(Collectors.toList());
方式三:提取转换方法,提升代码可读性
如果转换逻辑复杂,可单独提取一个转换方法,再通过方法引用简化代码:
// 单独的转换方法 private MyDto convertToDto(Object[] obj) { MyDto dto = new MyDto(); dto.setFirstName((String) obj[0]); dto.setLastName((String) obj[1]); dto.setAddress((String) obj[2]); return dto; } // 调用示例 List<MyDto> dtoList = objects.stream() .map(this::convertToDto) .collect(Collectors.toList());
注意事项
- 确保
Object[]中元素的类型与MyDto字段类型一致,避免ClassCastException; - 确认查询结果的列顺序与你映射的字段顺序完全匹配,否则会出现属性值错位;
- 如果存在
null值,可根据业务需求添加默认值处理(例如obj[0] == null ? "" : (String) obj[0])。
内容的提问来源于stack exchange,提问作者tisispa1
相关产品推荐
相关产品推荐

