我有一个使用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!
}
}
答案 0 :(得分:3)
方法参考是:
Consumer<T>
,这意味着他们接受参数并且不返回任何内容。例如,System.out::println
是Consumer<String>
。Producer<T>
,这意味着他们不接受参数并返回一些东西。例如,UUID::randomUUID
是Producer<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