Java Optional-orElse语句执行异常及需求实现咨询
问题修复:优先匹配指定模式,无匹配时返回符合条件的第一个元素
原代码在列表里找不到带pattern:a:b:的元素时,总会抛出java.util.NoSuchElementException,而且第二个分支(找不含pattern:c:d:的元素)根本没执行。问题出在误用了Optional.ofNullable()包装findFirst()的结果——Stream.findFirst()本身就返回Optional<String>,永远不会是null,这就导致orElse分支完全不会触发,直接走后面的orElseThrow(),第一个流没找到元素就直接抛异常了。
修复后的代码
List<String> list = Arrays.asList("TEST1", "TEST2", "TEST3"); final String finalStr = list.stream() .filter(s -> s.contains("pattern:a:b:")) .map(str -> str.substring(str.lastIndexOf(':') + 1)) .findFirst() .orElseGet(() -> list.stream() .filter(s -> !s.contains("pattern:c:d:")) .findFirst() .orElseThrow());
修复说明
- 删掉多余的
Optional.ofNullable(),直接用findFirst()返回的Optional调用orElseGet() - 用
orElseGet()代替orElse(),保证第二个流的操作只有在第一个流没匹配到元素时才会执行,避免没必要的遍历 - 第二个流的
findFirst()后面保留orElseThrow(),如果所有元素都带pattern:c:d:,就抛出异常(如果不需要抛异常,可以换成orElse("默认值"))
场景验证
- 场景1:列表为
["pattern:a:b:TEST1", "pattern:c:d:TEST2", "TEST3"]→ 返回TEST1 - 场景2:列表为
["pattern:c:d:TEST1", "TEST2", "TEST3"]→ 返回TEST2 - 场景3:列表为
["TEST1", "TEST2", "TEST3"]→ 返回TEST1
内容的提问来源于stack exchange,提问作者Saad
相关产品推荐
相关产品推荐

