gpt4 book ai didi

java - 处理 lambda 中的检查异常

转载 作者:行者123 更新时间:2023-12-02 09:02:37 25 4
gpt4 key购买 nike

我有一些代码会引发已检查的异常。我想在 lambda 中调用该代码,以便从另一个 map 创建 map :

Map<String, Coordinate> map = getMap();
Map<String, Integer> result = map.entrySet().stream().collect(
toMap(x -> x.getKey(), x -> doSomething(x.getValue)));

哪里doSometing是抛出异常的代码:

int doSomething(Coordinate c) throws MyException { ... }

现在编译器肯定会提示异常没有被处理。所以我用 try-catch 包围它,看起来很丑:

Map<String, Integer> result = map.entrySet().stream().collect(
toMap(x -> x.getKey(), x -> {
try {
return doSomething(x.getValue());
} catch (MyException e) {
e.printStackTrace();
// return some error-code here???
}
}));

它也无法编译,因为我们需要返回 catch 中的内容-案件。然而,在这种特殊情况下,返回任何内容都没有多大意义,这就是为什么我实际上不想在该级别处理异常。我不能只处理创建 lambda 的调用代码中的异常吗?所以说只是高了一层?

try {
Map<String, Integer> result = ...
} catch (MyException e) { ... }

但是这不会编译,因为 lambda 抛出的异常没有得到处理。

最佳答案

来自Baeldung's blog :您可以定义可以抛出Exception的消费者:

@FunctionalInterface
public interface ThrowingConsumer<T, E extends Exception> {
void accept(T t) throws E;
}

和一个静态包装器,将检查异常映射到RuntimeException:

static <T> Consumer<T> throwingConsumerWrapper(
ThrowingConsumer<T, Exception> throwingConsumer) {

return i -> {
try {
throwingConsumer.accept(i);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
};
}

然后你可以调用它:

Map<String, Integer> result = map.entrySet().stream()
.collect(
throwingConsumerWrapper(toMap(x -> x.getKey(), x -> doSomething(x.getValue)))
);

关于java - 处理 lambda 中的检查异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60059078/

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