将方法传递给方法

时间:2018-01-25 17:37:34

标签: java

我有一个使用Deque的方法。在一个地方,有时我想Deque.pullFirst(),有时Deque.pullLast()。它应该取决于传递给该方法的一个参数。如何使用Java 8?

这是我对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!
   }
}

2 个答案:

答案 0 :(得分:3)

方法参考是:

  • Consumer<T>,这意味着他们接受参数并且不返回任何内容。例如,System.out::printlnConsumer<String>
  • Producer<T>,这意味着他们不接受参数并返回一些东西。例如,UUID::randomUUIDProducer<UUID>
  • Function<T,Z>,这意味着他们采用类型为T的参数(可以是应用该方法的实例)并返回类型为Z的结果,在您的情况下Deque::pollFirst take是一个{ {1}}。另一个例子是Function<Deque<Integer>, Integer>,其中deq是deq::add的一个实例,它是Deque<Integer>

所以你应该使用Function<Integer, Boolean>代替Callable,这是完全不同的东西。 Function<Deque<Integer>, Integer>也需要iterateThroughQueue(...)

答案 1 :(得分:2)

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);
}

打印:

1
2
3
size after iteration = 0