1.Java8中的Stream可以做什么?
Java8中的Stream主要用来对容器/集合中的数据进行操作,它主要分为三个流程:起始操作,中间操作,终止操作
起始操作:指定一个数据源(一般为集合List,Set等)
中间操作:对数据源(集合)中的数据采用筛选,过滤,类型转换
注:中间操作不会造成对数据源中源数据的污染,即原集合中的数据结构以及数据不会因为Stream的中间操作而改变
终止操作:可以将中间操作后的数据进行分组汇总、统计,并可以针对操作后的数据生成新的容器集合
二、Stream常用操作演示(主要对工作中常用到的三种中间操作--filter, sort, map进行阐述)
1、Stream的中间操作---filter筛选
(1)筛选事例1
// filter 1
List<Account> uidEquals1 = bunchOfAccounts.stream()
.filter(account -> account != null && "1".equals(account.getUid()))
.collect(Collectors.toList());
uidEquals1.forEach(account -> System.out.println(account.getNickName()));
该事例是将Account集合中每个account不为NULL并且ID为1的account全部通过中间操作-filter筛选出来,并使用collect进行组合为一个新的集合。
(2)筛选事例2
// filter 2
List<Account> uidEquals2List = bunchOfAccounts.stream()
.filter(account -> {
if (account != null) {
if ("炸鸡小子3".equals(account.getNickName())) {
return true;
}
}
return false;
})
.collect(Collectors.toList());
uidEquals2List.forEach(account -> System.out.println(account.getNickName()));
该事例主要想告诉大家,如果filter方法体中包含多条语句并结合{}的使用筛选方式,filter方法参数为Predicate函数式接口,它的返回值约定必须为一个boolean类型的值,如何不加{},默认返回方法体中指定的条件表达式的结果。如果遇到业务较复杂的代码,就要使用到return关键字手动返回结果。
2、Stream的中间操作---sort排序
(1)排序事例1--按指定字段升序
// sort 1---默认的升序排序
List<Account> uidSorted1List = bunchOfAccounts.stream()
.sorted(Comparator.comparing(Account::getUid))
.collect(Collectors.toList());
uidSorted1List.forEach(account -> System.out.println(account.getUid()));
该事例将id进行默认的升序排序,使用Java8的Stream提供的排序接口,可以不用专门针对对应的实体类实现Comparable接口,并重写compareTo方法。细心的人可能会发现代码中有Account : : getUid,这样一句代码,它就是Java8中的(方法引用),主要配合Lambda以及Stream使用。该排序不仅支持升序,也支持降序,代码如下:
(2)排序事例2--按指定字段降序
// sort 2---降序排序
List<Account> uidSorted2List = bunchOfAccounts.stream()
.sorted(Comparator.comparing(Account::getUid).reversed())
.collect(Collectors.toList());
uidSorted2List.forEach(account -> System.out.println(account.getUid()));