话不多说,这里有一个常规的业务场景,我想根据从前端传来的几个字段,比如需要排序的字段、第几页、一页显示几条从后台取出对应的数据。
如果说按照一般的做法,那肯定是在sql里面操作,取到对应的字段,我这里使用jdk1.8的语法
比如一个实体类
public class User{
........//这里省略实体类里面的字段,因为这个例子暂时不需要出现它们
假设我先从数据库里面查出来一个数据集合
List<User> list=..........;//从数据库查出
假设根据字段排序,那这要用到Comparator关键字
Comparator<User> comparator = Comparator.comparing(user -> {
try {
Field field = User.class.getDeclaredField(orderBy);//这里的orderBy就是前端传来的根据什么字段排序
//这里使用的是反射的语法
field.setAccessible(true);
if (!Comparable.class.isAssignableFrom(field.getType())) {
throw new BadRequestException("order_by:" + orderBy + "不可排序");
}
return (Comparable)field.get(user);
} catch (NoSuchFieldException e) {
throw new BadRequestException("order_by:" + orderBy + "不存在", e);
} catch (IllegalAccessException e) {
throw new InternalServerException(e);
}
});
最后一句话就可以搞定了:
list.stream().sorted(comparator).skip((pageNumber-1+1)* pageSize).limit(pageSize).collect(Collectors.toList())
这里说明一下,这里使用的是正序排列,如果是倒序排列,sorted(comparator.reversed())
pageNumber就是显示第几页,pageSize就是一页显示几条,这样数据就可以根据需求取出,不用再考虑页数问题导致的空数据,还要再去加判断条件去开发这个需求了。
这里我最后想谈谈我学习jdk1.8的一些感悟。
1、很多人都说jdk1.8很多语法都是语法糖,我非常不同意这个观点。首先大家要知道jdk是谁开发的?jdk是oracle工程师开发的,我相信他们是这个行业最最顶尖的开发人员了吧,这些精英会无聊到开发一些仅仅是不同写法的东西吗?
2、我们回到语法本身,那jdk1.8到底好在哪里;第一,那就是对开发人员的方便。我们就拿这个需求来说,一般来说你要用Mybatis操作,是不是首先需要建立一个查询sql的接口,类似于Mapper,然后再建一个实现这个sql接口的实现类,最后才再mybatis中的xml里面写sql,这样一看如果写一句sql,要在三个文件里面操作,一旦需求改变了,开发人员就需要维护三个文件,这样在需求多的情况下自己都会手忙脚乱。
3、第二点,jdk1.8大大提升对数据库的性能,因为可以很少甚至不用去访问数据库了,比如我列的这个需求,不要看按字段排序需要那么麻烦,但是这仅仅是对java层面的操作,根本不用访问数据库。你要知道,根据字段排序的关键函数 order by 是非常损耗数据库的性能的,还有很多数据库里的关键函数比如,group by、sum等等都可以用jdk1.8语法所取代,这里就不多展开了。
4、最后呢,我想说,一种语言的语法不断改进肯定有开发者的理由,也许新语法还有这样或那样的不完善,但这也就是开发人员不断去更新不断追求完美的理由吧,这也需要大家的思考和钻研,而不是武断地认为新语法就一定不好或者一定好。
以上