在Java8中将`Callable`改编为`Supplier`

时间:2014-12-31 12:43:12

标签: functional-programming java-8

我在一个类的几个地方有以下代码块:

    final Key key = ...;
    return CompletableFuture.supplyAsync(
            () -> FooDelegate.call(key, () -> {
                return doSomething();
            }
    }...

我想要改编自SuppliersupplyAsync()所需)FROM自定义Callable代码块。方法FooDelegate.call()包装真正的代码块(这里它只是doSomething(),以lambda形式提供) - 我们需要传递多个参数,例如key(即{{1不会是一个功能界面。)

FooDelegate的代码,一个单独的类,因为它需要重用:

FooDelegate

我的问题:

  1. 有更好的方法吗:public class FooDelegate { public static <T> T call(Key key, Callable<T> callable) { try { return callable.call(); } catch (ExecutionException e) { ... } ... handle exceptions etc. } }

  2. ...() -> FooDelegate.call(key, () -> {...只是一个带有单一静态方法的虚拟类。不确定我是否喜欢它。还有什么更好的吗?

1 个答案:

答案 0 :(得分:1)

提供static方法的类(甚至是单个static方法)没有任何问题。我不确定你真正想做什么,特别是因为对其他参数的需求不明确但是假设你在异常处理代码中的某个地方使用它并按照你所写的处理其他所有内容,我想你真正想要的是什么要做的是:

public class FooDelegate {
    public static <T> Supplier<T> call(Key key, Callable<T> callable) {
        return () -> {
            try {
                return callable.call();
            }
            catch(ExecutionException e) {
                //...
                throw new RuntimeException(); // or return fall-back
            }
            catch(Exception ex) {
                //... handle exceptions etc.
                throw new RuntimeException(); // or return fall-back
            }
        };
    }
}

用例:

final Key key = null;//...;
return CompletableFuture.supplyAsync(FooDelegate.call( key, () -> doSomething() ));

可以简化为

final Key key = null;//...;
return CompletableFuture.supplyAsync(FooDelegate.call(key, MyClass::doSomething ));

final Key key = null;//...;
return CompletableFuture.supplyAsync(FooDelegate.call(key, this::doSomething ));

取决于doSomethingstatic还是实例方法......


如果您需要其他用例的原始方法,您可以考虑提供两种方法:

public class FooDelegate {
    public static <T> Supplier<T> supplier(Key key, Callable<T> callable) {
        return () -> call(key, callable);
    }
    public static <T> T call(Key key, Callable<T> callable) {
        try {
            return callable.call();
        }
        catch(ExecutionException e) {
            //...
            throw new RuntimeException(); // or return fall-back
        }
        catch(Exception ex) {
            //... handle exceptions etc.
            throw new RuntimeException(); // or return fall-back
        }
    }
}

并将使用网站更改为

final Key key = null;//...;
return CompletableFuture.supplyAsync(FooDelegate.supplier(key, () -> doSomething() ));