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接口特性)更简练的更多相关文章

  1. 常用的函数式接口_Predicate接口_默认方法and和Predicate接口练习_集合接口筛选

    默认方法:and 既然是条件判断,就会存在与.或.非三种常见的逻辑关系.其中将两个Preadicate条件使用"与"逻辑连接起来实现"并且"的效果时,可以使用d ...

  2. java8新特性:接口的默认方法与静态方法

    接口中一共可以定义三种方法: 1.抽象方法,也就是需要实现者必须实现的方法,最常见的那种 2.默认方法,不需要实现者实现 3.静态方法,不需要实现者实现 默认方法: 允许在已有的接口中添加新方法,而同 ...

  3. 我脑中的JVM大全附带Java8的特性

    Java虚拟机-sun classic vm 世界上第一款商用的Java虚拟机. 只能使用纯解释器的方式来执行Java代码. Java虚拟机-ExactVM Exact Memory Manageme ...

  4. ArcGIS 网络分析[8.2] 资料2 使用IDatasetContainer2接口的CreateDataset方法创建网络数据集

    上节提及如何使用IDatasetContainer2接口访问到网络数据集,上例可以封装为一个方法. 这节就使用IDatasetContainer2接口(Geodatabase类库)的CreateDat ...

  5. java9新特性-7-语法改进:接口的私有方法

    1.官方Feature 213: Milling Project Coin Support for private methods in interfaces was briefly in consi ...

  6. Java9 新特性

    Java9中的9个新特性 1. Java 平台级模块系统 2. Linking 3. JShell: 交互式 Java REPL 4. 改进的 Javadoc 5. 集合工厂方法 6. 改进的 Str ...

  7. Java9 新特性 详解

    作者:木九天   <   Java9 新特性 详解  > Java9 新特性 详解 摘要: 1.目录结构 2.repl工具 jShell命令 3.模块化 4.多版本兼容jar包 5.接口方 ...

  8. 【Java基础】Java9 新特性

    Java9 新特性 模块化系统 Java 和相关生态在不断丰富的同时也越来越暴露出一些问题: Java 运行环境的膨胀和臃肿.每次 JVM 启动的时候,至少会 30-60MB 的内存加载,主要原因是 ...

  9. 传统JIT和java9新特性AOT理解

    java慢的原因 1.  除了少量基本类型用栈存储外,所有对象都使用堆存储.堆的性能低于栈. 2.  很多强制类型转换(cast)或加查,耗用内存大.java运行时对类型检测,如果类型不正确会抛出Cl ...

随机推荐

  1. P2285 [HNOI2004]打鼹鼠

    P2285 [HNOI2004]打鼹鼠 题目描述 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的.根据这个特点阿牛编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某 ...

  2. 解决不了bug的时候看一下:

    解决不了bug的时候看一下: 1.机器是不会出错的,出错的一定是人.只是你还没有意识到哪里出了错. 2.产生bug 的原因想错了,你以为是系统的bug ,那么你肯定就不想着去解决,你也就解决不了. 这 ...

  3. X-Frame-Options是什么?

    错误: Refused to display 'http://xx.com/spot/kline.do' in a frame because it set 'X-Frame-Options' to ...

  4. 深入理解synchronize

    本文参考引用,本人整理个人理解.地址点击 1.实现原理 synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性. 下面是一些 ...

  5. sklearn中predict()与predict_proba()用法区别

    predict是训练后返回预测结果,是标签值. predict_proba返回的是一个 n 行 k 列的数组, 第 i 行 第 j 列上的数值是模型预测 第 i 个预测样本为某个标签的概率,并且每一行 ...

  6. python鉴黄程序

    最近有客户向服务器上传了些垃圾图片,和正常图片混合在一起,大概有10W张的数量,在经历了大概3个小时翻了2000多张的时候,手指抽了下,感觉很不舒服,硬着头皮上,写个程序鉴别下吧,但是怎么搞呢,经过从 ...

  7. 破解navicat

    每次试用版也真的是烦,注册机试过一次后,又提示注册 果断选择其他方法 官网先下载一个正版 再下patchNavicat.exe 安装完navicat后直接点击patchNavicat 选择navica ...

  8. iPhone新建项目不能全屏

    上个周做项目的时候,发现新建了一个项目不能全屏.伤透了我的脑筋,然后又请教了团队里其他两个大牛帮我搞定了这个问题. 虽然是搞定了,但也看的出大牛也是云里雾里.歪打正着解决的. 今天又想新做个项目,这个 ...

  9. Python洗牌算法重写

    Python有自带的洗牌算法函数shuffle(). 自己也通过学习也琢磨了一下它的实现,然后给出一个时间复杂度O(n),空间复杂度O(4)的例子: import random def shuffle ...

  10. Vuex, api, SSR, module

    vuex https://vuex.vuejs.org/zh/guide/actions.html 单向数据流 单例模式 & 多个组件共享状态 State & 状态注入 Vue.use ...