我刚刚开始学习骆驼,我看到的第一件事就是
context.addRoutes(new RouteBuilder() {
        public void configure() {
            from("file:data/inBox?noop=true").to("file:data/outBox");
        }
    });

我(合理的IMHO)试图替换

context.addRoutes(()->from("file:data/inBox?noop=true").to("file:data/outBox"));

但这是无效的.

在我挖掘的时候,我发现,lambdas应用于功能界面(这被认为是接口限定),但是@FunctionalInterface注释只能应用于接口(足够公平),据我所知,没有抽象类的等效注释. RouteBuilder当然是一个抽象类.

为什么lambdas限于接口?

接口和类之间的本质区别是什么使得“功能类”不安全/不可预测/不合理?

我可以理解,如果有一些限定词,如抽象方法必须公开,但我很失落地解释为什么上述是不合理的.

解决方法

这是JSR-335专家组中最困难和广泛辩论的决定之一.一方面,单抽象方法抽象类可能是羊羔的合理转换目标似乎是完全合理的.而且,如果你的心理模式是“羔羊只是紧密的匿名课”,那么这个理论是完全合理的.

然而,如果你拉一下这个字符串一段时间,你会意识到它拖延了很多复杂性和约束 – 为了少数用例.

这是拖拉的最糟糕的事情之一是在lambda体内的名称的含义,作为一个特殊情况,这个意思.在内部类的体内,有一个非常复杂的查找规则(“梳子查找”),因为内部类中的名称可以引用超类型的成员,或者可以从词汇环境中获取. (例如,许多bug和益智游戏都围绕着这个,而不是Outer.this,在内部类体中.)如果我们允许lambda转换来抽象SAM类,我们会有两个不好的选择;用内部类的可怕名称查找复杂性污染所有的lambdas,或允许转换为抽象类目标,但是限制访问,使得lambda主体不能引用基类的成员(这将导致其自身的混乱).我们得到的结果规则是非常干净的:除了lambda参数formals之外,lambda体内的名称(包括这只是一个名字)正好意味着它们在lambda体之外的意思.

将lambdas转换为内部类的另一个问题就是对象标识,以及随之而来的VM优化丢失.内部类创建表达式(例如,新的Foo(){})被保证具有唯一的对象标识.通过不强烈地对lambdas进行身份识别,我们释放虚拟机可以做出许多有用的优化,否则无法做到. (因此,lambda链接和捕获已经比匿名类更快了,而且我们还没有应用更深入的优化流程.)

此外,如果您有一个单抽象方法抽象类,并希望能够使用lambdas来创建它们,那么有一个简单的路径来实现这一点 – 定义一个以函数接口为参数的工厂方法. (我们在Java 8中为ThreadLocal添加了一个工厂方法,这样做)

“lambdas”的最后一个钉子就是方便的对象语法“,在对现有代码库进行了分析,并且使用了单抽象方法接口和抽象类之后,世界观点就来了.我们发现只有很小的比例是基于抽象类.把所有的羔羊与复杂性和性能问题混为一谈,只能使得不到1%的用途受益,这似乎是愚蠢的.所以我们做出了“勇敢”的决定,削减了这个用例,以获得其他99%的好处.

java-8 – 为什么不能将@FunctionalInterface应用于SAM抽象基类的更多相关文章

  1. Swift语言工厂设计模式和抽象工厂设计模式

    工厂设计模式封装UI控件2.1扩展label。

  2. Swift设计模式之工厂方法模式

    转自Swift设计模式原文Design-Patterns-In-Swift

  3. Swift设计模式之抽象工厂模式

    转自Swift设计模式原文Design-Patterns-In-Swift

  4. Swift 2.0协议扩展和Java / C#抽象类之间有区别吗?

    通过在Swift2.0中添加协议扩展,似乎协议基本上成为Java/C#抽象类.我唯一可以看到的不同之处在于抽象类限制为单一继承,而Swift类型可以符合任何数量的协议.这是对Swift2.0中的协议的正确理解,还是有其他差异?有几个重要的区别…

  5. android – Proguard保留接口和抽象类的参数名称

    我试图阻止proguard从混淆接口方法参数.让我说我的lib中有这个接口:这个proguard文件:然后我组装发布,我得到:抽象类或使用@Keep注释也是如此.混淆选项keepparameternames似乎只适用于常规类.任何的想法?),ProGuard将保留元数据.

  6. PHP中抽象类、接口的区别与选择分析

    这篇文章主要介绍了PHP中抽象类、接口的区别与选择,较为详细的分析了PHP中抽象类与接口的概念、用法、区别与使用注意事项,需要的朋友可以参考下

  7. Java创建型设计模式之抽象工厂模式(Abstract Factory)

    当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式,抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态

  8. php设计模式之抽象工厂模式分析【星际争霸游戏案例】

    这篇文章主要介绍了php设计模式之抽象工厂模式,结合星际争霸游戏案例形式分析了PHP抽象工厂模式的具体原理、使用技巧与相关操作注意事项,需要的朋友可以参考下

  9. PHP设计模式之抽象工厂模式实例分析

    这篇文章主要介绍了PHP设计模式之抽象工厂模式,结合实例形式分析了php抽象工厂模式的概念、原理、使用方法及相关操作注意事项,需要的朋友可以参考下

  10. 详解Java语言中的抽象类与继承

    这篇文章主要为大家详细介绍了Java语言中的抽象类与继承的相关资料,文中的示例代码讲解详细,对我们学习Java有一定的帮助,感兴趣的小伙伴快跟随小编一起了解一下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部