Java 8如何实现带动态参数的Mapper函数?
解决方案
要实现将cities和codes列表中对应位置的元素配对传入getDesc方法,你可以通过遍历索引的方式关联两个列表的元素,具体实现如下:
修改后的核心逻辑
在main方法中,将原来的流处理代码替换为:
List<String> descs = IntStream.range(0, codes.size()) .mapToObj(i -> getDesc(cities.get(i), codes.get(i))) .distinct() .filter(desc -> desc != null && !desc.isEmpty()) .collect(Collectors.toList());
完整修改代码
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; public class TEST{ public static String getDesc(String domain, String code){ String ret = ""; switch(domain){ case "AAA" : if(code.equals("0")){ ret = "AAA_Descr_0"; }else if(code.equals("1")){ ret = "AAA_Descr_1"; } break; case "BBB" : if(code.equals("0")){ ret = "BBB_Descr_0"; }else if(code.equals("1")){ ret = "BBB_Descr_1"; } break; } return ret; } public static void main(String []args){ List<String> cities = Arrays.asList("AAA","AAA","BBB", "BBB"); List<String> codes = Arrays.asList("0","1","0","1"); List<String> descs = IntStream.range(0, codes.size()) .mapToObj(i -> getDesc(cities.get(i), codes.get(i))) .distinct() .filter(desc -> desc != null && !desc.isEmpty()) .collect(Collectors.toList()); descs.stream().forEach(System.out::println); } }
逻辑说明
IntStream.range(0, codes.size())生成从0到列表长度-1的索引流,保证能遍历到每一对对应的city和codemapToObj(i -> getDesc(cities.get(i), codes.get(i)))通过索引同时获取两个列表中同位置的元素,传入getDesc生成描述文本- 保留原有的
distinct()去重和filter()过滤空值逻辑,最终得到符合要求的描述列表
执行后输出与预期一致:
AAA_Descr_0 AAA_Descr_1 BBB_Descr_0 BBB_Descr_1
注意:需确保
cities和codes两个列表长度相同,否则会抛出IndexOutOfBoundsException
内容的提问来源于stack exchange,提问作者prokopis
相关产品推荐
相关产品推荐

