Java Stream操作报Missing return statement错误,如何正确将List转UUID为key的Map?
错误原因
map()是Stream的中间转换操作,接收的Function函数式接口要求必须有返回值,你仅在lambda中执行put操作没有返回值,自然会报Missing return statement错误。
除此之外这种写法本身不符合Stream设计规范:map()仅用来做元素类型转换,你用它执行往外部Map写数据的副作用操作逻辑不合理,而且中间操作需要搭配终端操作才会实际执行,哪怕你加了无意义的return,只要没加终端操作,这段代码运行后Map还是空的。
正确写法
写法1:普通增强for循环(最直观,无额外依赖)
不需要用Stream的场景直接用for循环即可:
Map<UUID, Product> productMap = new HashMap<>(); for (Product product : productList) { productMap.put(product.getUuid(), product); }
写法2:forEach遍历
如果想用lambda风格,直接调用集合自带的forEach方法即可,它接收Consumer函数式接口不需要返回值:
Map<UUID, Product> productMap = new HashMap<>(); productList.forEach(product -> productMap.put(product.getUuid(), product));
写法3:Stream收集器(推荐函数式写法,无副作用)
不用提前初始化Map,直接通过Collectors.toMap收集器生成目标Map,代码更简洁:
import java.util.function.Function; import java.util.stream.Collectors; // ... Map<UUID, Product> productMap = productList.stream() .collect(Collectors.toMap( Product::getUuid, // 取UUID作为Map的键 Function.identity() // 取Product对象本身作为Map的值 ));
如果List中存在重复的UUID,toMap默认会抛出重复键异常,可以补充第三个合并函数参数处理冲突,比如重复时保留先出现的元素:
Map<UUID, Product> productMap = productList.stream() .collect(Collectors.toMap( Product::getUuid, Function.identity(), (existing, newOne) -> existing ));
内容的提问来源于stack exchange,提问作者user17186249
相关产品推荐
相关产品推荐

