[译]java9新特性:在接口中用pirvate方法让default(java8接口特性)更简练
Java8 带来了许多改变,其中之一就是default修饰的接口方法。
这些方法改变了我们已知的接口,现在我们能够在接口中定义默认实现方法。默认实现方法的不同之处在于,在接口中用default修饰抽象方法后,该方法可以拥有方法体,实现他的方法可以不重写default修饰的方法而且可以直接调用。
如果你大量使用default方法在你的应用接口中,你将很快意识到他没有真正精简代码。
因为你不能在接口中提炼default里重复的代码到一个新的普通方法,这与以精简代码为目的的default关键字相冲突。
但在java9中这个问题被引入的 private interface methods 解决了。这些新定义的规则可以让你在接口中创建private修饰的方法,这样我们就可以在接口中构造更加简练的代码。
利用Java9的 private interface methods 重构 default 方法
代码实例:
接口--Archive
public interface Archive { List<Article> getArticles(); default List<Article> filterByTitle(String title) {
return getArticles().stream()
.filter(article -> article.getTitle().equals(title))
.collect(Collectors.toList());
} default List<Article> filterByTag(String tag) {
return getArticles().stream()
.filter(article -> article.getTags().contains(tag))
.collect(Collectors.toList());
}
}
正如你所看到的,Archive包含一个抽象方法- getArticles ,和两个default方法- filterByTitle 和 filterByTag 。
现在,如果你仔细观察两个default方法,你会发现它们几乎相同。唯一的区别就是在filter方法中使用了不同的谓语而已。
这种重复的代码又土又没有必要。理应让default代码更加简练,幸运的是Java9的 private interface method 可以帮上忙。
下面是用 private interface methods 重写的Archive:
public interface NewArchive { List<Article> getArticles(); default List<Article> filterByTitle(String title) {
return filterBy(article -> article.getTitle().equals(title));
} default List<Article> filterByTag(String tag) {
return filterBy(article -> article.getTags().contains(tag));
} private List<Article> filterBy(Predicate<Article> toFilterBy) {
return getArticles().stream()
.filter(toFilterBy)
.collect(Collectors.toList());
}
}
这就是想要的结果,通过提取除了谓语以外的代码,我们移除了重复的内容,也让代码更具有可读性。
*英文链接:deadCodeRising
*原创译文
[译]java9新特性:在接口中用pirvate方法让default(java8接口特性)更简练的更多相关文章
- 常用的函数式接口_Predicate接口_默认方法and和Predicate接口练习_集合接口筛选
默认方法:and 既然是条件判断,就会存在与.或.非三种常见的逻辑关系.其中将两个Preadicate条件使用"与"逻辑连接起来实现"并且"的效果时,可以使用d ...
- java8新特性:接口的默认方法与静态方法
接口中一共可以定义三种方法: 1.抽象方法,也就是需要实现者必须实现的方法,最常见的那种 2.默认方法,不需要实现者实现 3.静态方法,不需要实现者实现 默认方法: 允许在已有的接口中添加新方法,而同 ...
- 我脑中的JVM大全附带Java8的特性
Java虚拟机-sun classic vm 世界上第一款商用的Java虚拟机. 只能使用纯解释器的方式来执行Java代码. Java虚拟机-ExactVM Exact Memory Manageme ...
- ArcGIS 网络分析[8.2] 资料2 使用IDatasetContainer2接口的CreateDataset方法创建网络数据集
上节提及如何使用IDatasetContainer2接口访问到网络数据集,上例可以封装为一个方法. 这节就使用IDatasetContainer2接口(Geodatabase类库)的CreateDat ...
- java9新特性-7-语法改进:接口的私有方法
1.官方Feature 213: Milling Project Coin Support for private methods in interfaces was briefly in consi ...
- Java9 新特性
Java9中的9个新特性 1. Java 平台级模块系统 2. Linking 3. JShell: 交互式 Java REPL 4. 改进的 Javadoc 5. 集合工厂方法 6. 改进的 Str ...
- Java9 新特性 详解
作者:木九天 < Java9 新特性 详解 > Java9 新特性 详解 摘要: 1.目录结构 2.repl工具 jShell命令 3.模块化 4.多版本兼容jar包 5.接口方 ...
- 【Java基础】Java9 新特性
Java9 新特性 模块化系统 Java 和相关生态在不断丰富的同时也越来越暴露出一些问题: Java 运行环境的膨胀和臃肿.每次 JVM 启动的时候,至少会 30-60MB 的内存加载,主要原因是 ...
- 传统JIT和java9新特性AOT理解
java慢的原因 1. 除了少量基本类型用栈存储外,所有对象都使用堆存储.堆的性能低于栈. 2. 很多强制类型转换(cast)或加查,耗用内存大.java运行时对类型检测,如果类型不正确会抛出Cl ...
随机推荐
- Android 自定义WebView 实现可以加载缓存数据
1.自定义WebView说明 1.1.这个WebView可以加载缓存的数据.(需要后端配合,将html转换成一个字符串,主要是图片要用特殊格式) 1.2.注入了图片链接,为了方便点击webView中的 ...
- 20145202马超《Java程序设计》第十周学习总结
一.网络编程 1.网络概述 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴.在发送和接收数据 ...
- 8,实例化Flask的参数 及 对app的配置
Flask 是一个非常灵活且短小精干的web框架 , 那么灵活性从什么地方体现呢? 有一个神奇的东西叫 Flask配置 , 这个东西怎么用呢? 它能给我们带来怎么样的方便呢? 首先展示一下: from ...
- laravel5.5配置信息
目录 1 环境配置 1.1 检索环境配置 1.2 确定当前环境 2 访问配置值 3 配置缓存 4 维护模式 配置文件在config目录下,为了便于不同人员的开发,我们可以使用不同的.env文件来配置各 ...
- es6实现简单模板编译
现在有各种框架,其中一个主要模块就是关于template.最火的vue.react等框架,在这一块上也是是下足了功夫.我也想写一个自己的模板编译工具,所以就做了个简单的实现,主要是使用es6的反引号编 ...
- 百度webuploader上传 1
百度webupload网址:http://fex.baidu.com/webuploader/ 引入js和css <script src="../../Content/webuploa ...
- 关于python中的 if __name__ == 'main'
name 是内置变量,它表示的是当前所在模块的名字,同时还能反应一个包的结构. a ├── b │ ├── c.py │ └── __init__.py └── __init__.py 目录中 ...
- ipa和ironic-conductor交互
IPA使用lookup和hearteat机制与Ironic Conductor进行交互,启动时agent给Conductor的vendor_passthru lookup endpoint(地址为/v ...
- [Ceres]C++优化库
官网教程: http://ceres-solver.org/nnls_tutorial.html 定义了一个最小二乘法求解器 自动求导的功能
- 深入理解css之float
1.float的历史 float的设计的初衷:文字环绕效果 2.包裹与破坏 增强浮动的感性认知 包裹:1.收缩 2.坚挺 3.隔绝 里面的布局和外面一点关系都没有 包裹的特性就是BFC block f ...