所以我连续20个二传手,所有这些都可能会失败。如果一个失败或者使用try catch将它们包围起来,而不是跳过所有这些,那么有没有办法用Java 8s的一些功能来做到这一点?
例如,我在想这样的事情:
public void mapElement(Function function) {
try the function
catch if something goes wrong
}
然后我可以像这样使用它:
mapElement(myObject.putA(a));
mapElement(myObject.putB(b));
mapElement(myObject.putC(c));
....
答案 0 :(得分:10)
这样的事情怎么样:
public void tryTo(Runnable action) {
try {
action.run();
} catch (Exception e) {
// do something?
}
}
tryTo(() -> myObject.putA(a));
tryTo(() -> myObject.putB(b));
tryTo(() -> myObject.putC(c));
请注意,myObject
,a
,b
和c
都需要effectively final才能生效。
上面的内容是使用一个方法来获取Runnable
的数组并在循环中执行它们:
public void tryAll(Runnable... actions) {
for (Runnable action : actions) {
try {
action.run();
} catch (Exception e) {
// do something?
}
}
}
tryAll(() -> myObject.putA(a),
() -> myObject.putB(b),
() -> myObject.putC(c));
答案 1 :(得分:5)
您可以使用Runnable
功能界面
它的函数描述符是() -> void
。
它完全适合您的需要,因为映射操作不返回结果,您也不需要指定任何参数作为函数的输入。
确实在这里:myObject.putA(a)
,您不想将a
参数传递给该功能。
您希望将整个表达式myObject.putA(a)
作为lambda体传递:
() -> myObject.putA(a);
您可以这样写mapElement()
方法:
public static void mapElement(Runnable mapProcessor) {
// Retry logic
try {
mapProcessor.run();
} catch (Exception e) {
// exception handling
}
}
请注意,要捕获任何Java异常(已检查和运行时),您必须捕获RuntimeException
而不是Exception
。
您可以这样使用mapElement()
:
MyObject myObject = new MyObject();
...
mapElement(() -> myObject.putA(a));
mapElement(() -> myObject.putB(b));
mapElement(() -> myObject.putC(c));
Runnable
可能无法传达预期的意义,因为它主要是
专为线程执行而设计
如果有意义,您也可以介绍自己的功能界面。
通过这种方式,如果它看起来相关,您也可以在函数中声明任何特定的已检查异常
Runnable
无法实现这一目标。
例如:
@FunctionalInterface
public interface MapProcessor{
void map() throws MappingException;
}
你可以这样使用它:
public static void mapElement(MapProcessor mapProcessor) {
// Retry logic
try {
mapProcessor.map();
}
catch (MappingException e) {
// Mapping exception handling
}
catch (Exception e) { // or RuntimeException if more relevant
// other exception handling
}
}