传统的的Java 集合操做是有些啰嗦的,当咱们须要对结合元素进行过滤,排序等操做的时候,一般须要写好几行代码以及定义临时变量。
而Java8 Stream API 能够极大简化这一操做,代码行数少,且易读。java
咱们以“找女友”为例来看看Java8的Stream API相比传统写法有多香。假设咱们定义了一个女友类,具备几个关键的指标:姓名,身高,体重,颜值。以下所示:程序员
class Girl { private String name; private int height; private int weight; private int score; // 省略get,set及hashCode等方法 }
咱们有一批适龄女青年名单,以下:api
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的女孩,而后按颜值排序前三名。ide
因为数据可能有重复,这会干扰咱们的筛选,所以,第一步先去掉重复数据。代码以下:工具
List<Girl> girlList = initGirlList();// 初始化一批数据 // 数据去重 List<Girl> distinctGirl = new ArrayList<>(); for (Girl g: girlList){ if(!distinctGirl.contains(g)){ distinctGirl.add(g); } }
这里new了一个新的distinctGirl
来存放去重以后的数据,代码很简单,没啥可说的。code
下面咱们要去掉不合格的数据,本次筛选条件是身高>=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。ci
通过上面啰嗦的两步,咱们获得了符合咱们要求的数据,如今咱们须要根据颜值高低进行排名,代码以下:get
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多行代码,才能明白其逻辑。
这里咱们在回顾一下,咱们的目标:从一个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的兴致。问卷:你如今使用的版本是多少?
评论下面附了完整源码