Java8的Predicate,让代码更简洁

作者:微信小助手

发布时间:2019-02-02T22:12:47

在我们的代码中,经常会编写是否为真的代码,比如用户名是否存在,客户是否存在等。类似如下代码:

public boolean exist(Long userId){

   ...

   return false;

}


这样做已经很棒了。但你需要了解一个java8的Predicate。通过Predicate可以让你的代码更加的简洁。学习下Predicate吧。


Predicate是一个函数接口。它包含了一个接口方法和三个默认方法以及一个静态方法。

Predicate表示断定和假设的意思。


test


test接口就是为了让你实现判断的效果。最原始的就是去实现这个接口,然后写我们的判断逻辑,如下:

你也看到有一部分灰色的代码,告诉我们这个可以被优化为lambda表达式,如下:

你也可以把Predicate的实现单独抽离成一个实现类,方便重用。

Predicate不仅可以单独在代码中使用,也可以在测试代码中用来做判断,同时还可以被用在Stream的filter中,用来做过滤。

使用Predicate可以让你的判断逻辑代码更加的简洁和解耦,增加了可读性、可测试性,同时符合DRY原则


DRY原则:(don’t repeat yourself): writing code more than once is not a good fit for a lazy developer ;)It also makes your software more difficult to maintain because it becomes harder to make your business logic consistent。一句话:别写重复代码


现在你的代码看起来已经很炫酷了。但别急,接下来的几个操作会让你的代码看起来更加的清晰而明了。当你写了一个“大于20”的条件时,此时需求变了,需要一个新的条件20<x<30。


此时你有两条路,一条路是直接修改Predicate的test方法中的逻辑。还有一条路是新建一个新的Predicate,然后和现有的组装成为一个新的Predicate。第一条路相信你经常走,接下来就来介绍下第二条路:组装。


and


首先新建一个LessThan30Predicate:

然后和上面的CustomPredicate用and方法组装成一个新的Predicate。如下:

输出结果:

or

同样也可以使用or来组装。

输出结果:


negate


你也可以使用negate方法把现有的Predicate变为否定的Predicate。

输出结果: