Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8中作为参数的函数指针_Java_Jpa_Java 8 - Fatal编程技术网

Java8中作为参数的函数指针

Java8中作为参数的函数指针,java,jpa,java-8,Java,Jpa,Java 8,为了减少JPA中属性每次更新时的代码重复,我想交出一个指向doTransaction的函数指针并调用该函数。我如何在Java8中做到这一点 public void modifySalary(Person person, float salary) { doTransaction(person.setSalary(salary)); } public void doTransaction(final Function<Void, Void> func) { em.ge

为了减少JPA中属性每次更新时的代码重复,我想交出一个指向
doTransaction
的函数指针并调用该函数。我如何在Java8中做到这一点

public void modifySalary(Person person, float salary) {
    doTransaction(person.setSalary(salary));
}

public void doTransaction(final Function<Void, Void> func) {
    em.getTransaction().begin();
    func.apply(null);
    em.getTransaction().commit();
}
公共作废修改薪资(个人、浮动薪资){
doTransaction(个人固定工资);
}
公共无效点交易(最终功能func){
em.getTransaction().begin();
函数应用(空);
em.getTransaction().commit();
}

在这种情况下,您需要一个无参数的void函数,
可运行的
就足够了

public void modifySalary(Person person, float salary) {
  doTransaction(()->person.setSalary(salary));
}

public void doTransaction(Ruunable runnable) {
    em.getTransaction().begin();
    runnable.run();
    em.getTransaction().commit();
}
您可以接受
doTransaction
的as参数,并向其传递更新person的lambda表达式。这里,我们只使用
Runnable
作为一个函数接口,它定义了一个不带参数也不返回值的方法

public void modifySalary(Person person, float salary) {
    doTransaction(() -> person.setSalary(salary));
}

public void doTransaction(Runnable action) {
    em.getTransaction().begin();
    action.run();
    em.getTransaction().commit();
}

如果您认为Runnable这个名称与线程有太多的联系,那么您可以使用自己的接口来定义一个不带参数也不返回值的函数方法。例如,如果要将其命名为
Action
,则可以

@FunctionalInterface
interface Action {
    void perform();
}

然后在
doTransaction
内部调用
action.perform()

我知道它链接到线程。但它在没有定义自己的@FunctionInterface的情况下工作。有什么想法吗?@msch事实上,这就是我要说的。在本例中,我们之所以使用它,是因为它是一个现有的函数接口,不接受任何参数,也不返回任何值。与线程没有任何真正的联系。我回答的第二部分只是提供一个替代名称。
Runnable
没有链接到线程。API设计者故意决定在
java.util.function
包中不包含
void
noarg函数,因为已经存在的类型
Runnable
满足了这一要求。@Holger不知道,你有链接吗?我很想知道为什么会这样做。布赖恩·戈茨在评论中证实了这一点。