Optional<List<Entity>>场景下orElseGet与map用法相关疑问
方案2中首行map的作用
你这里调用的是**Optional类自带的map方法**,不是Stream的map方法,它的作用逻辑固定为:
- 如果当前
Optional对象非空(isPresent() == true),就将Optional包裹的取值传入你传入的转换函数,返回一个包裹了转换结果的新Optional对象 - 如果当前
Optional为空,直接返回空的Optional对象
对应你的代码逻辑:opListEntity是Optional<List<MyEntity>>类型,调用map时传入的lambda函数入参myEntities就是Optional里存的List<MyEntity>实例,lambda内部将这个List逐个转换为Dto并收集为List<MyEntityDto>,因此map执行结束后得到的就是Optional<List<MyEntityDto>>类型的对象,最后调用orElseGet(ArrayList::new)就实现了「为空时返回空列表」的需求,和方案1的if-else逻辑完全等价。
方案4无法运行的原因
方案4有两层核心错误:
- 类型不匹配错误:
Optional的stream()方法是Java 9才新增的API,就算你用的是支持该方法的JDK版本,opListEntity.stream()得到的是一个最多只有1个元素的Stream,这个元素是完整的List<MyEntity>对象,不是List里的每个MyEntity实例。你直接调用map(myEntityMapper::entityToDto)相当于试图把List<MyEntity>类型的对象传给仅接收MyEntity类型参数的转换方法,编译直接报错。 - 语法调用错误:
collect(Collectors.toList())执行结束后得到的是List类型的对象,而orElseGet是Optional类才有的方法,List实例根本没有这个方法,语法层面就无法通过编译。
内容的提问来源于stack exchange,提问作者Himanshu Dabas
相关产品推荐
相关产品推荐

