Java 8:用lambda替换匿名类

时间:2017-11-14 13:33:14

标签: java lambda java-8

我在替换此特定示例时遇到问题:

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

1 个答案:

答案 0 :(得分:6)

不,你不能。 DefaultConsumer不是FunctionalInterface(并且不能是:more info here)因此不是lambda目标。

<强>解释

每个匿名类可以用lambda表达式替换吗?

答案是否定的。您可以为非final类和接口创建匿名类。 lambda表达式不一样。这些只能用于需要SAM接口的地方,即只有单一抽象方法的接口(在Java 8之前,每个接口方法都是抽象的,但是因为Java 8接口也可以有默认和静态方法不抽象,因为他们有实施。)

那么哪些匿名类可以用lambda表达式替换?

只有作为SAM接口实现的匿名类(如Runnable,ActionListener,Comparator,Predicate)才能被lambda表达式替换。 DefaultConsumer不能是lambda目标,因为它甚至不是接口。

那么消费者呢?

即使Consumer是一个接口,它也不是SAM接口,因为它有多个抽象方法,所以它也不能是一个lambda目标。