Java过滤列表无匹配项时如何返回符合要求的Optional对象
你当前的写法存在的问题是:Collectors.toList() 始终会返回非null的List实例(即便没有匹配元素也会返回空列表),因此用Optional.of()直接包装的话,得到的Optional永远是非空的,无法实现无匹配项时返回Optional.empty()的要求。
解决方案1:紧凑写法(流式处理一步完成)
使用Collectors.collectingAndThen在收集完成后直接做判断处理:
Optional<List<Item>> discFit = items.stream() .filter(item -> item.getDiscount() <= 0) .collect(Collectors.collectingAndThen( Collectors.toList(), list -> list.isEmpty() ? Optional.empty() : Optional.of(list) ));
解决方案2:可读性更强的写法
先收集为列表再手动判断,逻辑更直观:
List<Item> filteredItems = items.stream() .filter(item -> item.getDiscount() <= 0) .collect(Collectors.toList()); Optional<List<Item>> discFit = filteredItems.isEmpty() ? Optional.empty() : Optional.of(filteredItems);
两种实现的效果完全一致,可以根据团队代码风格自行选择。
内容的提问来源于stack exchange,提问作者SilentSlippers
相关产品推荐
相关产品推荐

