我在替换此特定示例时遇到问题:
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [x] Received '" + message + "'");
}
};
是否可以用lambda替换它,因为它使用DefaultConsumer的非默认构造函数?
来自rabbitMQ java教程 - > LINK to whole class
答案 0 :(得分:6)
不,你不能。 DefaultConsumer不是FunctionalInterface(并且不能是:more info here)因此不是lambda目标。
<强>解释强>
答案是否定的。您可以为非final类和接口创建匿名类。 lambda表达式不一样。这些只能用于需要SAM接口的地方,即只有单一抽象方法的接口(在Java 8之前,每个接口方法都是抽象的,但是因为Java 8接口也可以有默认和静态方法不抽象,因为他们有实施。)
只有作为SAM接口实现的匿名类(如Runnable,ActionListener,Comparator,Predicate)才能被lambda表达式替换。 DefaultConsumer不能是lambda目标,因为它甚至不是接口。
即使Consumer是一个接口,它也不是SAM接口,因为它有多个抽象方法,所以它也不能是一个lambda目标。