1,Predicate
2,Comparable
Java8的Predicate,让代码更简洁
在我们的代码中,经常会编写是否为真的代码,比如用户名是否存在,客户是否存在等。类似如下代码:
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
and
首先新建一个LessThan30Predicate:
然后和上面的CustomPredicate用and方法组装成一个新的Predicate。如下:
输出结果:
or
输出结果
negate
你也可以使用negate方法把现有的Predicate变为否定的Predicate。
输出结果
Comparable
- public interface Comparable
- 该接口对实现它的每个类的对象强加一个整体排序。这个排序被称为类的自然排序 ,类的compareTo方法被称为其自然比较方法 。
Comparable接口里面要实现CompareTo方法
CompareTo要实现不同类的对象的对比,返回一个int值
返回1的意思是
s2存储时要跟s1比,因为CompareTo返回的是,正数,所以程序认为s2比s1大。
那么输出的值就是正序。如果CompareTo返回的是-1那就说明,s2比s1小
则会倒序存储。
如果我们要按照年龄来存储。
比如说
执行ts.add(s2)时,会调用s2的CompareTo方法,这里传入的参数肯定是s1
新来对象的调用CompareTo方法
如果s2的年龄大于s1则会返回一个正数,故s2排在s1后面。
如果s2的年龄小于s1则会返回一个负数,故s2排在s1前面。
这里s5的年龄也是33,之后的CompareTo会比较年龄,如果年龄一样,则返回0,故不添加元素。
但是如果只是年龄相同,但是名字不同,本质上还是不同的元素,我们应该视为不同的值。
我们应该加一个当 num = 0 时的判断。
Comparator的使用
Comparator类似于Comparable接口,都需要实现一个接口来返回一个比较的大小。
o1是现在传入的参数,o2是上一个传入的参数。
前面的和后面的比,返回正数就是前面的大。