gpt4 book ai didi

java - 在流中处理空指针和抛出异常

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:32:29 24 4
gpt4 key购买 nike

让我们考虑一个 Parent 类,它只包含一个 Integer 属性。我创建了 6 个父类对象和一个空变量。然后我将这些对象添加到列表中。

我想通过Integer 属性的值来检索对应的对象。我为此使用了 Java 8 Streams。

Predicate<Parent> predicate = e -> e.getId() == 100; // sample attribute value
result = list.stream().filter(predicate).collect(Collectors.toList());

但是我遇到了NullPointerException,所以我编辑了代码:

list.stream().filter(h -> h!=null).filter(predicate).collect(Collectors.toList());

但如果任何对象为空,我想抛出异常。如果列表中没有对象为空,那么我想从列表中检索相应的对象。

如何使用 Java 8 Streams 使用单个语句实现此目的?

最佳答案

JB Nizet 回答没问题,但它使用 map 只是为了它的副作用而不是为了映射操作,这有点奇怪。当您只对某些东西的副作用感兴趣时可以使用一种方法,例如抛出异常:peek

List<Parent> filtered = list.stream()
.peek(Objects::requireNonNull)
.filter(predicate)
.collect(Collectors.toList());

如果您想要自己的异常,只需在其中放置一个 lambda:

List<Parent> filtered = list.stream()
.peek(p -> { if (p == null) throw new MyException(); })
.filter(predicate)
.collect(Collectors.toList());

检查异常

如果您的异常被检查,您可以事先检查是否为 null,如果您不介意遍历列表两次。这可能最适合您的情况,但不一定总是可行。

if (list.contains(null)) throw new MyCheckedException();

您还可以在流管道中抛出未经检查的异常,捕获它然后抛出已检查的异常:

try {
...
.peek(p -> { if (p == null) throw new MyException(); })
...
} catch (MyException exc) {
throw new MyCheckedException();
}

鬼鬼祟祟的 throw

或者您可以走优雅但有争议的道路并使用偷偷摸摸的 throw 方法

但要当心!这种技术绕过了已检查的异常系统,您应该知道自己在做什么。一定要声明周围的方法抛出MyCheckedException!如果您不这样做,编译器将不会警告您,如果已检查的异常出现在不期望的地方,它可能会导致奇怪的错误。

@SuppressWarnings("unchecked")
public <T extends Throwable> void throwSneakily(Throwable t) throws T {
throw (T) t;
}

public void m() throws MyCheckedException {
List<Parent> filtered = list.stream()
.peek(p -> { if (p == null) throwSneakily(new MyCheckedException()); })
.filter(predicate)
.collect(Collectors.toList());
}

关于java - 在流中处理空指针和抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31334326/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com