如何在Java 8中获取集合内嵌套元素的指定索引值列表?
解决Java 8 Lambda提取嵌套列表指定索引元素的问题
嘿,我来帮你搞定这个问题!你编译失败的原因很明确——用错了flatMap,咱们一步步理清楚:
问题出在哪?
你的代码sanList.stream().flatMap(x -> x.get(1).stream())里,x.get(1)返回的是单个元素(比如你示例里的domain1.com这种字符串),而flatMap要求lambda表达式返回一个Stream对象,单个元素显然不符合要求,这就是编译报错的根源。
正确的实现方式
因为你要做的是每个子列表对应提取一个元素(不是把子列表拆成多个元素扁平化),所以应该用map而不是flatMap。
基本实现(提取索引1的元素)
假设sanList是List<List<String>>类型,直接用map提取每个子列表的索引1元素,再收集成你想要的集合:
// 如果你想要Set(和示例格式一致) Set<String> domainSet = sanList.stream() .map(subList -> subList.get(1)) .collect(Collectors.toSet()); // 如果你想要List List<String> domainList = sanList.stream() .map(subList -> subList.get(1)) .collect(Collectors.toList());
安全版(避免空指针/索引越界)
如果存在子列表为空、或者子列表长度不足2的情况,建议先过滤掉这些无效的子列表:
Set<String> domainSet = sanList.stream() // 过滤掉null子列表,以及长度小于2的子列表(确保索引1存在) .filter(subList -> subList != null && subList.size() > 1) .map(subList -> subList.get(1)) .collect(Collectors.toSet());
补充:如果你其实想提取第一个元素(索引0)
要是你说的“第1个索引值”是笔误,实际想取子列表的第一个元素,只需要把get(1)改成get(0)就行:
Set<String> domainSet = sanList.stream() .filter(subList -> subList != null && !subList.isEmpty()) .map(subList -> subList.get(0)) .collect(Collectors.toSet());
再啰嗦下map和flatMap的区别
map:把流中的每个元素转换成另一个元素(一对一)flatMap:把流中的每个元素转换成一个流,再把所有流合并成一个流(一对多,扁平化)
你这里是一对一的转换场景,所以map才是正确选择~
内容的提问来源于stack exchange,提问作者Sankalp
相关产品推荐
相关产品推荐

