如何使用Java8简化forEach循环逻辑,实现对象属性批量拷贝优化代码
Java8 Stream 实现方案
直接转换实现(无额外依赖)
逻辑和原代码完全等价,无需引入额外工具,仅用Stream API简化集合操作:
import java.util.stream.Collectors; public OrganizationalUnitTeamsList getTeamsDetails() { List<OrganizationalUnit> organizationalUnitList = organizationalUnitConnector.getOrganizationalUnit(); // 流式完成对象转换与集合收集 List<TeamDetails> availableTeamList = organizationalUnitList.stream() .map(organizationalUnit -> { TeamDetails teams = new TeamDetails(); teams.setHierarchyLevel(organizationalUnit.getHierarchyLevel()); teams.setLocationName(organizationalUnit.getLocationName()); teams.setName(organizationalUnit.getName()); teams.setShortName(organizationalUnit.getShortName()); return teams; }) .collect(Collectors.toList()); OrganizationalUnitTeamsList teamsListResponse = new OrganizationalUnitTeamsList(); teamsListResponse.setTeams(availableTeamList); return teamsListResponse; }
如果使用JDK16及以上版本,可以直接调用.toList()替代.collect(Collectors.toList()),写法更简洁。
可选优化方案
1. 配合属性拷贝工具简化代码
如果项目已经引入Spring、Apache Commons BeanUtils等工具,可以用属性拷贝省略手动Setter逻辑:
import org.springframework.beans.BeanUtils; import java.util.stream.Collectors; public OrganizationalUnitTeamsList getTeamsDetails() { List<TeamDetails> availableTeamList = organizationalUnitConnector.getOrganizationalUnit() .stream() .map(organizationalUnit -> { TeamDetails teams = new TeamDetails(); BeanUtils.copyProperties(organizationalUnit, teams); return teams; }) .collect(Collectors.toList()); OrganizationalUnitTeamsList teamsListResponse = new OrganizationalUnitTeamsList(); teamsListResponse.setTeams(availableTeamList); return teamsListResponse; }
注意:使用属性拷贝工具前需要确认两个类的同名字段类型完全匹配,避免出现类型转换异常;性能略低于手动Setter,对性能要求极高的场景不推荐使用。
2. 新增构造方法进一步简化
如果允许修改TeamDetails类,可以新增接收OrganizationalUnit参数的构造方法,代码会更简洁:
// TeamDetails类新增构造方法 public TeamDetails(OrganizationalUnit unit) { this.hierarchyLevel = unit.getHierarchyLevel(); this.locationName = unit.getLocationName(); this.name = unit.getName(); this.shortName = unit.getShortName(); } // 业务方法简化后 public OrganizationalUnitTeamsList getTeamsDetails() { List<TeamDetails> availableTeamList = organizationalUnitConnector.getOrganizationalUnit() .stream() .map(TeamDetails::new) .collect(Collectors.toList()); OrganizationalUnitTeamsList teamsListResponse = new OrganizationalUnitTeamsList(); teamsListResponse.setTeams(availableTeamList); return teamsListResponse; }
普通业务场景下Stream写法和原有for循环性能差异可以忽略,代码可读性和简洁性提升明显。
内容的提问来源于stack exchange,提问作者Ruturaj Shinde
相关产品推荐
相关产品推荐

