如何简化从Java列表获取单个匹配Person对象的代码
如何更简洁地从Person列表中获取firstName为'John'的单个对象?
嘿,你提到的findFirst().get()确实比最初的collect(Collectors.toList()).get(0)要简洁不少,但咱们还能在简洁性+健壮性上再优化下:
1. 更安全的短代码(规避NPE)
你原来的filter逻辑里,如果某个Person的firstName是null,调用equals()会直接抛NullPointerException。把条件反过来写,既能避免这个问题,代码长度几乎没变化:
personList.stream() .filter(p -> "John".equals(p.getFirstName())) .findFirst().get()
2. 极致紧凑的一行写法
要是你不在意换行,直接把代码压成一行会更短:
personList.stream().filter(p -> "John".equals(p.getFirstName())).findFirst().get()
3. 优雅处理“找不到”的情况(可选)
直接调用get()的话,如果列表里没有符合条件的对象,会抛NoSuchElementException。如果想避免这个问题,用orElse()或orElseThrow()处理,代码也没长多少:
// 找不到就返回null personList.stream().filter(p -> "John".equals(p.getFirstName())).findFirst().orElse(null); // 找不到就抛自定义异常 personList.stream().filter(p -> "John".equals(p.getFirstName())).findFirst().orElseThrow(() -> new IllegalArgumentException("没找到名为John的用户"));
补充一句
在Java 8及以上的版本里,JDK原生的Stream API已经是最简洁的实现了,完全不需要引入第三方库。要是追求极致字符数,还可以静态导入Stream相关方法,但其实没必要——可读性比少几个字符重要多了。
内容的提问来源于stack exchange,提问作者CrazySynthax
相关产品推荐
相关产品推荐

