下面的代码等效的lambda表达式是什么?
List<String> List = new ArrayList<String>();
for (String var: alreadyList) {
try {
if (getNumber(var) == num) {
filteredList.add(var);
}
} catch(NullPointerException exception) {
throw exception;
}
}
getNumber
方法抛出Nullpointerexception
,上面的代码也在向调用者抛出相同异常的方法中。这是通常的lambda表达式,但是如何将Nullpointerexception
放在其中?
List<String> List = alreadyList.stream()
.filter(var -> getNumber(var) == num)
.collect(Collectors.toList());
答案 0 :(得分:3)
赶上NPE是不好的做法。 NPE是未经检查的异常。来自docs:
如果参数为null,则该方法可能会抛出NullPointerException,这是未经检查的异常。
为什么不将另一个过滤器添加到流中?
List<String> List = alreadyList.stream()
.filter(e -> e!= null)
.filter(var -> getNumber(var) == num)
.collect(Collectors.toList());
答案 1 :(得分:2)
捕获NullPointerException是不好的做法。您可以使用Optional类来避免它,并且仅在存在对象时才执行必要的操作。您可以从getNumber()方法中抛出其他异常,而不会出现任何问题
答案 2 :(得分:1)
从不捕获包括NullPointerException
在内的未经检查的异常。您要做的只是将其扔掉。要么过滤掉null
值。
List<String> List = alreadyList.stream()
.filter(Objects::nonNull)
.filter(var -> getNumber(var) == num)
.collect(Collectors.toList());
您提供的代码:
List<String> List = alreadyList.stream()
.filter(var -> getNumber(var) == num)
.collect(Collectors.toList());
在NullPointerException
失败的情况下,将已经抛出getNumber(var)
。您的try-catch
没什么不同。