能否用Java 8 Streams简化生成Optional的Java方法代码?
可以实现,简化后的代码如下:
protected Optional<String> getMediaName(Participant participant) { Map<String, String> mediaMap = config.getMediaMap(); return participant.getDevices().stream() .filter(device -> device.getMedia() != null) .map(ParticipantDevice::getMedia) .filter(media -> StringUtils.isNotEmpty(media.getMediaType())) .map(media -> media.getMediaType().toUpperCase()) .filter(mediaMap::containsKey) .map(mediaMap::get) .findFirst(); }
代码逻辑说明:
- 先获取媒体映射表
mediaMap,避免在流操作中重复调用config.getMediaMap(),提升效率 - 将设备列表转为Stream,通过
filter过滤出媒体对象不为null的设备 - 用
map提取设备对应的媒体对象 - 再次
filter过滤出媒体类型非空的媒体对象 - 把媒体类型统一转为大写形式
- 过滤出存在于媒体映射表中的媒体类型
- 提取映射表中对应的媒体名称
- 最后调用
findFirst(),找到第一个符合条件的结果就返回包装好的Optional,遍历完都没找到则返回Optional.empty(),完全匹配原代码的逻辑
内容的提问来源于stack exchange,提问作者AP_22
相关产品推荐
相关产品推荐

