Java函数作为方法参数

Java函数作为方法参数,java,graph,Java,Graph,我正在使用一个以图形表示的系统。我经常需要以某种方式遍历图形,并对沿途传递的节点应用不同的操作。我想在一个类中实现遍历逻辑,然后该类将获得必须作为其提供的方法的输入参数应用的操作。大概是这样的: class GraphTraverse{ public static void traverseAndApplyOperation(Graph graph, Node startNode, Function operationToApply){ // go through the g

我正在使用一个以图形表示的系统。我经常需要以某种方式遍历图形,并对沿途传递的节点应用不同的操作。我想在一个类中实现遍历逻辑,然后该类将获得必须作为其提供的方法的输入参数应用的操作。大概是这样的:

class GraphTraverse{

    public static void traverseAndApplyOperation(Graph graph, Node startNode, Function operationToApply){

    // go through the graph and apply the input function (specified somewhere else) on the passed nodes

    }
}
Java是否提供了将方法作为输入参数传递的可能性?如果是,正确的语法是什么?

Java 8及更高版本 Java8通过中的预定义接口提供了很好的实现方法,具体取决于所需的函数类型

在您的例子中,您可能正在寻找一个函数,该函数接受一个
节点
,并且不返回任何内容。在Java8中,这称为

公告 或者更好,如果您有一个静态方法
static void MyClass.myMethod(Node)
,您可以直接引用它:

traverseAndApplyOperation(graph, startNode, MyClass::myMethod);
如果在
节点
类中有一个非静态的0-arg方法,该方法也可以工作:

traverseAndApplyOperation(graph, startNode, Node::myMethod);
Java 7及以下版本 只需使用一个方法定义自己的接口,类似于Java8的
消费者

然后,您不能使用lambda对其进行实例化,但仍然可以使用老式方法:

traverseAndApplyOperation(graph, startNode, new NodeConsumer() {
    @Override
    public void accept(Node node) {
        // do something here
    }
});
Java8及更高版本 Java8通过中的预定义接口提供了很好的实现方法,具体取决于所需的函数类型

在您的例子中,您可能正在寻找一个函数,该函数接受一个
节点
,并且不返回任何内容。在Java8中,这称为

公告 或者更好,如果您有一个静态方法
static void MyClass.myMethod(Node)
,您可以直接引用它:

traverseAndApplyOperation(graph, startNode, MyClass::myMethod);
如果在
节点
类中有一个非静态的0-arg方法,该方法也可以工作:

traverseAndApplyOperation(graph, startNode, Node::myMethod);
Java 7及以下版本 只需使用一个方法定义自己的接口,类似于Java8的
消费者

然后,您不能使用lambda对其进行实例化,但仍然可以使用老式方法:

traverseAndApplyOperation(graph, startNode, new NodeConsumer() {
    @Override
    public void accept(Node node) {
        // do something here
    }
});

您可以查看和了解相同的基本用法。

您可以查看和了解相同的基本用法。

在Java 8中,您可以使用lambda表达式和方法引用来完成以下操作:

class GraphTraverse{
    public static void traverseAndApplyOperation(Graph graph, Node startNode, Consumer<Node> operation)
    {
         // pseudo code
         for each element {
             operation.accept(currentNode);
         }
    }
}
方法参考:

public static void applyOperation(Node n)
{
    // a regular static method in the class
}

traverseAndApplyOperation(graph, startNode, ClientClass::applyOperation);

public void applyOperation(Node n)
{
    // a regular dynamic method in the class
}

traverseAndApplyOperation(graph, startNode, this::applyOperation);
之所以可以这样做,是因为
java.util.function.Consumer
是一个功能接口。它是一个只有一种方法要实现的接口,而这些都只是该接口的匿名实现。然后,另一个代码可以获得实现并调用它,正如它提供的那样


如果您想了解更多信息,您可能需要在Java 8中搜索“lambda表达式”、“函数接口”以及“方法引用”,并阅读一些文档。

在Java 8中,您可以使用lambda表达式和方法引用来完成此任务:

class GraphTraverse{
    public static void traverseAndApplyOperation(Graph graph, Node startNode, Consumer<Node> operation)
    {
         // pseudo code
         for each element {
             operation.accept(currentNode);
         }
    }
}
方法参考:

public static void applyOperation(Node n)
{
    // a regular static method in the class
}

traverseAndApplyOperation(graph, startNode, ClientClass::applyOperation);

public void applyOperation(Node n)
{
    // a regular dynamic method in the class
}

traverseAndApplyOperation(graph, startNode, this::applyOperation);
之所以可以这样做,是因为
java.util.function.Consumer
是一个功能接口。它是一个只有一种方法要实现的接口,而这些都只是该接口的匿名实现。然后,另一个代码可以获得实现并调用它,正如它提供的那样


如果您想了解更多信息,您可能需要搜索Java 8中的“lambda表达式”、“函数接口”和“方法引用”,并阅读一些文档。

在哪个版本的Java中?使用某种接口,
Runnable
。例如,“Java方式”就是为您所调用的定义一个接口,并在类中实现它。您也可以使用反射API,但这不是一种干净的方式。在哪种版本的Java中?使用某种接口,例如
Runnable
。“Java方式”是为您调用的定义一个接口,并在类中实现它。您也可以使用反射API,但这不是一种干净的方法。