Java 8:用lambda替换匿名类

ohw*_*ppp 6 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 + "'");
    }
};
Run Code Online (Sandbox Code Playgroud)

是否可以用lambda替换它,因为它使用DefaultConsumer的非默认构造函数?

它来自rabbitMQ java教程 - > LINK到全班

Jua*_*oza 6

不,你不能.DefaultConsumer不是FunctionalInterface(并且不能:这里更多信息)因此不是lambda目标.

说明:

匿名类的lambda表达式被取代?

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

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

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

消费者怎么样?

尽管Consumer是一个接口,但它不是SAM接口,因为它有多个抽象方法,因此它也不能成为lambda目标.

  • 接口可以是一个"功能接口"而不需要注释`@ FunctionInterface` - 但是`DefaultConsumer`不是一个功能接口,原因有很多 - 不是接口; 多种方法都不是抽象的...... (2认同)