Java 将方法传递给另一个方法

Java 将方法传递给另一个方法,java,Java,我有一个使用Deque的方法。在第一个位置,有时我想Deque.pullFirst(),有时我想Deque.pullLast()。它应该取决于传递给方法的一个参数。如何使用Java8实现这一点 这是我对Callable的尝试,我知道它不起作用,但现在您可以理解我想要实现的目标: public class AppMain { public void iterateThroughQueue(Callable callable) { // error Deque<Int

我有一个使用Deque的方法。在第一个位置,有时我想
Deque.pullFirst()
,有时我想
Deque.pullLast()
。它应该取决于传递给方法的一个参数。如何使用Java8实现这一点

这是我对Callable的尝试,我知道它不起作用,但现在您可以理解我想要实现的目标:

public class AppMain {
    public void iterateThroughQueue(Callable callable) { // error
         Deque<Integer> deq = new ArrayDeque<>();

         deq.add(1);
         deq.add(2);
         deq.add(3);

         for (int i = 0; i < 3; i++) {
                System.out.println(callable.apply(deq)); // error!
         }
         System.out.println("size after iteration = "  + deq.size());
   }

   public static void main(String[] args) {  
         AppMain.iterateThroughQueue(Deque::pollFirst); // error!
   }
}
公共类AppMain{
public void iteratethrowqueue(Callable Callable){//error
Deque deq=新的阵列定义();
deq.add(1);
deq.add(2);
deq.add(3);
对于(int i=0;i<3;i++){
System.out.println(callable.apply(deq));//错误!
}
System.out.println(“迭代后的大小=“+deq.size());
}
公共静态void main(字符串[]args){
AppMain.IterateThrowQueue(Deque::pollFirst);//错误!
}
}

可调用的
在这里不起作用,但
函数将起作用

您可以尝试以下方法:

public static void iterateThroughQueue(Function<Deque<Integer>, Integer> function) {

    Deque<Integer> deq = new ArrayDeque<>();

    deq.add(1);
    deq.add(2);
    deq.add(3);

    for (int i = 0; i < 3; i++) {
        System.out.println(function.apply(deq));
    }
    System.out.println("size after iteration = "  + deq.size());
}

public static void main(String[] args) {
    iterateThroughQueue(Deque::pollFirst);
}

Callable
在这里不起作用,但是
Function
会起作用

您可以尝试以下方法:

public static void iterateThroughQueue(Function<Deque<Integer>, Integer> function) {

    Deque<Integer> deq = new ArrayDeque<>();

    deq.add(1);
    deq.add(2);
    deq.add(3);

    for (int i = 0; i < 3; i++) {
        System.out.println(function.apply(deq));
    }
    System.out.println("size after iteration = "  + deq.size());
}

public static void main(String[] args) {
    iterateThroughQueue(Deque::pollFirst);
}

方法引用为:

  • 消费者
    ,这意味着他们接受一个参数而不返回任何内容。例如,
    System.out::println
    是一个
    消费者
  • Producer
    ,这意味着它们不接受任何参数并返回某些内容。例如,
    UUID::randomUUID
    是一个
    生产者
  • Function
    ,这意味着它们接受类型为T的参数(可以是应用该方法的实例)并返回类型为Z的结果,在您的示例中,
    Deque::pollFirst
    take是一个
    函数
    。另一个例子是
    deq::add
    ,其中deq是
    Deque
    的一个实例,它将是一个
    函数

因此,您应该使用
函数
而不是Callable,因为Callable用于完全不同的东西。另外,
iteratethrowqueue(…)
需要是
静态的

方法引用是:

  • 消费者
    ,这意味着他们接受一个参数而不返回任何内容。例如,
    System.out::println
    是一个
    消费者
  • Producer
    ,这意味着它们不接受任何参数并返回某些内容。例如,
    UUID::randomUUID
    是一个
    生产者
  • Function
    ,这意味着它们接受类型为T的参数(可以是应用该方法的实例)并返回类型为Z的结果,在您的示例中,
    Deque::pollFirst
    take是一个
    函数
    。另一个例子是
    deq::add
    ,其中deq是
    Deque
    的一个实例,它将是一个
    函数

因此,您应该使用
函数
而不是Callable,因为Callable用于完全不同的东西。另外,
iteratethrowqueue(…)
需要是
静态的

可调用的
没有
应用()
方法。我知道,但现在你明白我想做什么了。使用
java.util.function.function
而不是
Callable
。函数没有副作用,我需要从Deque这里进行轮询。如何传递函数不是静态的
Deque::polFirst
?@Whffgfv Obggcg。你说的“副作用”是什么意思?
Callable
没有
apply()
方法。我知道,但现在你明白我想做什么了。使用
java.util.function.function
而不是
Callable
。函数没有副作用,我需要从Deque这里进行轮询。如何传递函数不是静态的
Deque::polFirst
?@Whffgfv Obggcg。你说的“副作用”是什么意思?