有没有办法将我的Java函数传递给try-catch函数?

时间:2017-11-01 19:58:04

标签: java java-8

所以我连续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));
....

2 个答案:

答案 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));

请注意,myObjectabc都需要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
  }
}