直入主题!
什么是stream流?
直观地讲,stream流是来自数据源的元素形成的一个队列,并且支持聚合操作。
哪些数据可以作为stream流的数据源?流的来源可以是集合,数组。但是,工作中以集合较为常见。在Java8中,我们可以使用集合接口提供的stream()方法生成流。就像下面这样。
List<String> list = Arrays.asList("a","b","c","abc");
list.stream();
stream流是Java8的新特性,它的出现,可以让开发者以一种声明式的方式来处理数据。
很多人不理解,什么是声明式的方式?看下面的栗子。
List<User> userList = this.list();
userList.stream().foreach(b -> b.setName("小芸君"));
上面第二行代码就是声明式的方式。也就是说,在stream流中,如果你想要使用流中的对象,只要作下声明,就可以使用了。
有了stream流,操作集合就变得简单了。接下来,我们就结合实际工作中应用场景来讲讲具体操作的使用。
-
假如我要获取年龄小于35岁的用户列表,那么像下面这样就可以了。
List<User> userList = userList.stream().filter(b -> b.getAge() < 35 ).collect(Collectors.toList());
fitler方法可以设置条件过滤出流中满足需要的元素。
-
假如我想通过现有的User列表得到一个只有User主键的新列表,也很简单。
List<Long> idList = userList.stream().map(User::getId()).collect(Collectors.toList());
map方法可以将每个元素映射到对应的结果,并且应用比较广泛,接着往下看。
-
假如我要目标用户列表里的每个人加薪500元,也可以使用map方法。
List<Bigdecimal> salaryAmount = userList.stream().map(b -> new Bigdecimal(500).add(b.getSalary())).collect(Colleactors.toList());
需要注意的一点是,上面使用map方法后的结果就是一个薪资的新List了。
-
假如我要给用户列表按年龄从大到小(降序)排序,那么该怎么做?
List<User> userList = userList.stream().sorted(Comparator.comparing(User::getAge()))
.revsersed().colect(Collectors.toList);
sorted方法可以对流进行排序。不过值得注意的是,在进行排序操作前,User实体类需要实现Comparable接口。
实际应用中我们很少这样做,一般都会在数据库层面进行排序。
-
假如我要对用户列表按部门分组
Map<Long,List<User>> userListMap = userList.stream().collect(Collectors.groupingBy(User::getDeptId(), Collectors.toList()));
分组之后返回的是以分组字段为key,List<User>为value的Map对象。
-
我们还可以将字符串列表转化为特定字符串
List<String> list = Arrays.asList("a","c","b","abc");
String str = list.stream().collect(Collectors.joining(","));
返回的str,是以逗号分隔的字符串。这有时候很有用!
stream流不是个特别难以掌握的技术,只能算是一个便捷的工具吧。但是,掌握它可以让我们的编程变得更优雅,更高效!