IT教程 ·

如何用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(七)核心容器 - 钩子接口

参与评论