如何用Java8 Stream API找到心仪的女朋友
【二】、UML基础知识——图图解乾坤
传统的的Java 鸠合操纵是有些烦琐的,当我们须要对连系元素举行过滤,排序等操纵的时刻,一般须要写好几行代码以及定义暂时变量。
而Java8 Stream API 能够极大简化这一操纵,代码行数少,且易读。
我们以“找女朋友”为例来看看Java8的Stream API比拟传统写法有多香。假定我们定义了一个女朋友类,具有几个症结的目的:姓名,身高,体重,颜值。以下所示:
class Girl {
private String name;
private int height;
private int weight;
private int score;
// 省略get,set及hashCode等要领
}
我们有一批适龄女青年名单,以下:
public static List<Girl> initGirlList(){
List<Girl> result = new ArrayList<>();
result.add(new Girl("赵小花",170,60,6));
result.add(new Girl("钱小花",171,62,7));
result.add(new Girl("孙小花",172,59,8));
// 省略....
return result;
}
心仪女朋友的挑选前提
假定心仪的女朋友是:体重,身高适中,颜值越高越好。本次设置的前提是找出:身高>=162 而且 体重<=53的女孩,然后按颜值排序前三名。
Java7的写法
数据去重
由于数据可能有反复,这会滋扰我们的挑选,因而,第一步先去掉反复数据。代码以下:
List<Girl> girlList = initGirlList();// 初始化一批数据
// 数据去重
List<Girl> distinctGirl = new ArrayList<>();
for (Girl g: girlList){
if(!distinctGirl.contains(g)){
distinctGirl.add(g);
}
}
这里new了一个新的distinctGirl
来存放去重以后的数据,代码很简朴,没啥可说的。
挑选数据
下面我们要去掉不合格的数据,本次挑选前提是身高>=162 而且 体重<=53,代码以下:
// 过滤身高,体重不相符的
List<Girl> girlTemp = new ArrayList<>();
for(Girl g: distinctGirl){
if(g.getHeight() >= 162 && g.getWeight() <= 53){
girlTemp.add(g);
}
}
这里运用上一步中去重以后的distinctGirl
,遍历,并将相符前提的放入新的list girlTemp
,这里又创建了一个中心list。
数据排序
经由上面烦琐的两步,我们得到了相符我们请求的数据,现在我们须要依据颜值上下举行排名,代码以下:
Collections.sort(girlTemp, new Comparator<Girl>() {
@Override
public int compare(Girl g1, Girl g2) {
BigDecimal score1 = new BigDecimal(g1.getScore());
BigDecimal score2 = new BigDecimal(g2.getScore());
return score2.subtract(score1).intValue();
}
});
这里使用了Collections
东西类的sort
要领,传递了一个匿名类,并在其compare
要领中完成了排序的逻辑,这依然是传统鸠合排序的操纵。
输出效果
经由上面的几步传统的Java鸠合操纵,我们终究得到了想要的数据。现在我们要输出前三名。
int i = 1;
for (Girl g : girlTemp) {
if(i>=3){
break;
}
System.out.println(g.toString());
}
OK,至此我们的程序输出了挑选的效果。上面的写法,貌似逻辑很清楚,一步步冉冉渐进。是的,这类传统的写法,Java程序员们已乐和和的写了许多年了。
一看这个代码足足有20多行!但是完成的逻辑并没有太庞杂啊?过阵子你回头看这个代码的话,你多数忘记了这么一大段代码是干吗的。假如有解释还好,你也许扫一一眼能协助你疾速理清代码做了啥。假如没有解释,你须要逐行去读完这20多行代码,才邃晓其逻辑。
Java8 Stream API的写法
这里我们在回忆一下,我们的目的:从一个girlList中找出:身高>=162 而且 体重<=53的女孩,然后按颜值排序前三名。Java8的代码以下:
List<Girl> girlList = initGirlList();
girlList.stream()
.filter( g -> g.getHeight() >= 162 && g.getWeight() <= 53)
.distinct()
.sorted(Comparator.comparing(Girl::getScore).reversed())
.limit(3)
.forEach( g -> System.out.println(g.toString()));
代码6行!而且纵然不相识Stream API,且你第一次看这个代码也能猜出是什么意义,filter-过滤,distinct-去重,sort-排序,limit-限定条数,forEach-遍历,就这么简朴。
结语
Java 这么老言语,现在都Java13了,但是,最具影响的版本我以为照样Java8。我上学那会儿,学校用Java6的写法教授教养。事情以后入手下手写Java7的try-with-resource
、钻石语法等。一向到现在,市面上许多项目都是Java7。有一次有同事给我说他在前公司写Java8被项目经理说了一顿,我问为啥。他说由于项目经理以为写Java7好保护,团队大家都会写Java7,写Java8的人不多……无语凝噎。
假如你还没用上Java8,希望本文中的小例子已胜利的勾起了你用上Java8的兴趣。问卷:
批评下面附了完全源码
Spring(七)核心容器 - 钩子接口