1,Predicate
2,Comparable


Java8的Predicate,让代码更简洁

在我们的代码中,经常会编写是否为真的代码,比如用户名是否存在,客户是否存在等。类似如下代码:
public boolean exist(Long userId){

return false;
}
这样做已经很棒了。但你需要了解一个java8的Predicate。通过Predicate可以让你的代码更加的简洁。学习下Predicate吧。
Predicate是一个函数接口。它包含了一个接口方法和三个默认方法以及一个静态方法。

image.png
Predicate表示断定和假设的意思。
test
test接口就是为了让你实现判断的效果。最原始的就是去实现这个接口,然后写我们的判断逻辑,如下:
image.png
你也看到有一部分灰色的代码,告诉我们这个可以被优化为lambda表达式,如下:
image.png
你也可以把Predicate的实现单独抽离成一个实现类,方便重用。
image.png
Predicate不仅可以单独在代码中使用,也可以在测试代码中用来做判断,同时还可以被用在Stream的filter中,用来做过滤。
image.png
使用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此时你有两条路,一条路是直接修改Predicate的test方法中的逻辑。还有一条路是新建一个新的Predicate,然后和现有的组装成为一个新的Predicate。第一条路相信你经常走,接下来就来介绍下第二条路:组装。
and
首先新建一个LessThan30Predicate:
image.png
然后和上面的CustomPredicate用and方法组装成一个新的Predicate。如下:
image.png
输出结果:
image.png
or
image.png
输出结果
image.png
negate
你也可以使用negate方法把现有的Predicate变为否定的Predicate。

image.png
输出结果

image.png


Comparable

image.png

  • public interface Comparable

  • 该接口对实现它的每个类的对象强加一个整体排序。这个排序被称为类的自然排序 ,类的compareTo方法被称为其自然比较方法

Comparable接口里面要实现CompareTo方法

CompareTo要实现不同类的对象的对比,返回一个int值

image.png

返回1的意思是

image.png

s2存储时要跟s1比,因为CompareTo返回的是,正数,所以程序认为s2比s1大。

image.png

那么输出的值就是正序。如果CompareTo返回的是-1那就说明,s2比s1小

则会倒序存储。

如果我们要按照年龄来存储。
image.png

比如说

image.png

执行ts.add(s2)时,会调用s2的CompareTo方法,这里传入的参数肯定是s1

新来对象的调用CompareTo方法

如果s2的年龄大于s1则会返回一个正数,故s2排在s1后面。
如果s2的年龄小于s1则会返回一个负数,故s2排在s1前面。

image.png

这里s5的年龄也是33,之后的CompareTo会比较年龄,如果年龄一样,则返回0,故不添加元素。

image.png

但是如果只是年龄相同,但是名字不同,本质上还是不同的元素,我们应该视为不同的值。

我们应该加一个当 num = 0 时的判断。

image.png


Comparator的使用

Comparator类似于Comparable接口,都需要实现一个接口来返回一个比较的大小。

image.png

o1是现在传入的参数,o2是上一个传入的参数。

image.png

前面的和后面的比,返回正数就是前面的大。