关于java:如何用Java8-Stream-API找到心仪的女朋友

传统的的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的人不多……无语凝噎。

零根底学习Java编程,能够退出我的十年Java学习园地。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理