Java Stream中InsId与AbcId映射实现问题(无Abc.getInsId方法)
用Java Stream实现InsId到AbcId的映射方案
没问题,我来帮你搞定这个映射问题!结合你描述的场景,我给你两种常用的实现方案:
情况1:批量获取ABC列表,且列表顺序与insIds完全对应
如果你的批量获取方法(比如getAbcList(insIds))返回的ABC对象列表,顺序和输入的insIds完全一一匹配,那可以通过索引关联的方式来构建映射:
import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.IntStream; // 假设的ABC类结构(无getInsId()方法) class ABC { private Integer abcId; public Integer getAbcId() { return abcId; } } public class MappingExample { // 模拟批量获取ABC列表的业务方法 private static List<ABC> getAbcList(List<Integer> insIds) { return insIds.stream().map(id -> { ABC abc = new ABC(); abc.abcId = id * 10; // 模拟业务生成的AbcId return abc; }).collect(Collectors.toList()); } public static void main(String[] args) { List<Integer> insIds = Arrays.asList(1, 2, 3, 4); Map<Integer, Integer> insIdToAbcIdMap = IntStream.range(0, insIds.size()) .boxed() .collect(Collectors.toMap( index -> insIds.get(index), // 映射的Key:原InsId index -> getAbcList(insIds).get(index).getAbcId() // 映射的Value:对应ABC的AbcId )); // 输出示例:{1=10, 2=20, 3=30, 4=40} System.out.println(insIdToAbcIdMap); } }
情况2:通过单个InsId获取对应的ABC对象
如果你的业务逻辑是需要根据每个InsId单独查询ABC(比如有getAbcByInsId(insId)方法),那可以直接遍历insIds流来构建映射:
import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; class ABC { private Integer abcId; public Integer getAbcId() { return abcId; } } public class MappingExample2 { // 模拟根据InsId获取单个ABC的业务方法 private static ABC getAbcByInsId(Integer insId) { ABC abc = new ABC(); abc.abcId = insId * 10; // 模拟业务生成的AbcId return abc; } public static void main(String[] args) { List<Integer> insIds = Arrays.asList(1, 2, 3, 4); Map<Integer, Integer> insIdToAbcIdMap = insIds.stream() .collect(Collectors.toMap( Function.identity(), // Key为原InsId insId -> getAbcByInsId(insId).getAbcId() // Value为对应ABC的AbcId )); // 输出示例:{1=10, 2=20, 3=30, 4=40} System.out.println(insIdToAbcIdMap); } }
关键注意事项
- 如果
insIds中存在重复值,Collectors.toMap()会抛出IllegalStateException,此时可以添加第三个参数处理冲突,比如保留第一个值:Collectors.toMap( Function.identity(), insId -> getAbcByInsId(insId).getAbcId(), (existing, replacement) -> existing // 重复时保留原有值 ) - 如果需要空值安全(比如某个InsId找不到对应的ABC),可以先过滤掉null的ABC对象:
insIds.stream() .map(insId -> Map.entry(insId, getAbcByInsId(insId))) .filter(entry -> entry.getValue() != null) .collect(Collectors.toMap( Map.Entry::getKey, entry -> entry.getValue().getAbcId() ))
内容的提问来源于stack exchange,提问作者KKlalala
相关产品推荐
相关产品推荐

