功能:Stream可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
核心概念理解
一个流的操作 = 创建流 + 中间操作 + 结果转换。
- 创建流:指从集合转换过滤,数值转换过滤、I/O转换、创建等等;
- 中间操作:指对流中的数据进行聚合,如filter\map\sorted\reduce、distinct等等;
- 结果转换:指将流进行输出,打印、转换成array、转换成collection等;
操作
public static void main(String[] array) {
List<User> userList = new ArrayList<>();
// 添加数据
User user = new User();
user.setName("小明");
user.setSex("男");
user.setAge(18);
user.setAgeBig(new BigDecimal(18));
user.setUserDate(LocalDateTime.now().minusYears(18));
User user1 = new User();
user1.setName("小黄");
user1.setSex("男");
user1.setAge(19);
user1.setAgeBig(new BigDecimal(19));
user1.setUserDate(LocalDateTime.now().minusYears(19));
User user2 = new User();
user2.setName("小红");
user2.setSex("女");
user2.setAge(20);
user2.setAgeBig(new BigDecimal(20));
user2.setUserDate(LocalDateTime.now().minusYears(20));
// 数据放入集合
userList.add(user);
userList.add(user1);
userList.add(user2);
/************************************** Java8 stream 基础操作 ************************************/
// 过滤数据(找出所有男的)
List<User> userManList = userList.stream().filter(u -> "男".equals(u.getSex())).collect(Collectors.toList());
System.out.println("所有的男孩:" + JsonUtils.getGson().toJson(userManList));
// 把所有人的名字取出来
List<String> userNameList = userList.stream().map(User::getName).collect(Collectors.toList());
System.out.println("所有人的名字:" + JsonUtils.getGson().toJson(userNameList));
// 根据出生年月日排序(顺序)
List<User> userSortedList = userList.stream().sorted(Comparator.comparing(User::getUserDate)).collect(Collectors.toList());
System.out.println("根据出生年月日排序 (顺序):" + JsonUtils.getGson().toJson(userSortedList));
// 根据出生年月日排序(倒序)
List<User> userSortedDescList = userList.stream().sorted(Comparator.comparing(User::getUserDate).reversed()).collect(Collectors.toList());
System.out.println("根据出生年月日排序(倒序):" + JsonUtils.getGson().toJson(userSortedDescList));
// 把所有人年龄求和 sum():求和,average():平均,count():计数
Integer userAgeSumList = userList.stream().mapToInt(User::getAge).sum();
System.out.println("把所有人年龄求和:" + userAgeSumList);
// 把所有人年龄求和 (BigDecimal 类型)
BigDecimal userAgeBigSumList = userList.stream().map(User::getAgeBig).reduce(BigDecimal.ZERO, BigDecimal::add);;
System.out.println("把所有人年龄求和 (BigDecimal 类型):" + userAgeBigSumList);
// 按性别就行分组
Map<String, List<User>> userSexGroupList = userList.stream().collect(Collectors.groupingBy(User::getSex));
// 遍历Map
for (Map.Entry<String, List<User>> userMap : userSexGroupList.entrySet()) {
System.out.println("性别:" + userMap.getKey() + " = " + JsonUtils.getGson().toJson(userMap.getValue()));
}
}
}
注:
JsonUtils.getGson().toJson() 方法只是用于把List对象转换成Json格式输出
结果
1,所有的男孩:[{"name":"小明","sex":"男","age":18,"ageBig":18,"userDate":"2002-10-13 16:04:11"},{"name":"小黄","sex":"男","age":19,"ageBig":19,"userDate":"2001-10-13 16:04:11"}]
2,所有人的名字:["小明","小黄","小红"]
3,根据出生年月日排序 (顺序):[{"name":"小红","sex":"女","age":20,"ageBig":20,"userDate":"2000-10-13 16:04:11"},{"name":"小黄","sex":"男","age":19,"ageBig":19,"userDate":"2001-10-13 16:04:11"},{"name":"小明","sex":"男","age":18,"ageBig":18,"userDate":"2002-10-13 16:04:11"}]
4,根据出生年月日排序(倒序):[{"name":"小明","sex":"男","age":18,"ageBig":18,"userDate":"2002-10-13 16:04:11"},{"name":"小黄","sex":"男","age":19,"ageBig":19,"userDate":"2001-10-13 16:04:11"},{"name":"小红","sex":"女","age":20,"ageBig":20,"userDate":"2000-10-13 16:04:11"}]
5,把所有人年龄求和:57
6,把所有人年龄求和 (BigDecimal 类型):57
7,性别:女 = [{"name":"小红","sex":"女","age":20,"ageBig":20,"userDate":"2000-10-13 16:04:11"}]
8,性别:男 = [{"name":"小明","sex":"男","age":18,"ageBig":18,"userDate":"2002-10-13 16:04:11"},{"name":"小黄","sex":"男","age":19,"ageBig":19,"userDate":"2001-10-13 16:04:11"}]