有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java8函数“包装器”函数,在执行给定的lambda之前执行某些操作?

我们有以下情况:

测试中期,需要更新一些上下文变量。测试的具体位置和应该发生什么是可变的。我想提供一个“包装器”函数,它设置一些上下文变量,然后执行函数调用中给出的所有断言

因此,类似于以下内容:

public void withDefaultContextA(Function<???, Void> noArgsCall) {

    setupDefaultContextA();
    noArgsCall.invoke() // not sure how apply() would be invoked here
}

或:

public void withContextA(BiFunction<???, Context, Void> providedContextCall) {

    setupContext(providedContext); // not sure how apply() would be invoked here
}

在相应的测试中,应按如下方式调用:

@Test
public void testSomething() {

    withDefaultContextA(() -> {
        ... // do some asserts
    }

    withContext((new Context(...)) -> {
        ... // do some asserts
    }
}

我怎样才能做到这一点?Java8函数可以这样使用吗?如果没有,我还有别的方法可以做到这一点吗


共 (1) 个答案

  1. # 1 楼答案

    似乎您想装饰任何给定的Runnable(您在问题中使用FunctionBiFunction,但当它们返回Void并且似乎没有收到任何参数时,在这里使用Runnable似乎更合适)

    您可以这样做:

    public static void withDefaultContext(Runnable original) {
        setupDefaultContextA();
        original.run();
    }
    

    然后,您可以按如下方式使用上述方法:

    withDefaultContext(() -> {
        // do some asserts
    });
    

    或具有特定上下文:

    public static void withContext(Context context, Runnable original) {
        setupContext(context);
        original.run();
    }
    

    用法:

    withContext(new Context(...), () -> {
        // do some asserts
    });