java.util.stream包下有一个Stream接口,有很多实用的方法,常用的几个:
Stream
Stream
Stream
Stream
思考题:一分钟内完成此题,只能用一行代码实现!
现在有5个用户,筛选:
1、ID 必须是偶数
2、年龄必须大于23岁
3、用户名转为大写字母
4、用户名字母倒着排序
5、只输出一个用户
- import java.util.Arrays;
- import java.util.List;
- /**
- * 其中sort为什么知道是通过name排序?因为上一步是通过map拿到了用户的name
- */
- public class MyTest{
- public static void main(String[] args) {
- User u1 = new User(1,"a",21);
- User u2 = new User(2,"b",22);
- User u3 = new User(3,"c",23);
- User u4 = new User(4,"d",24);
- User u5 = new User(6,"e",25);
- List
list = Arrays.asList(u1, u2, u3, u4, u5); - list.stream().filter(u->{return u.getId()%2==0;}).filter(u->{return u.getAge()>23;})
- .map(u->{return u.getName().toUpperCase();}).sorted((uu1,uu2)->{return uu2.compareTo(uu1);})
- .limit(1).forEach(System.out::println);
- //System.out::println就是把你遍历出来的每一个对象都用来去调用System.out
- // (也就是PrintStream类的一个实例)的println方法。
- //Consumer
c1 = System.out::println;等价于 - //Consumer
c2 = (x)->System.out.println(x); - }
- }
-
- class User{
- private int id;
- private String name;
- private int age;
-
- public User(int id, String name, int age) {
- this.id = id;
- this.name = name;
- this.age = age;
- }
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public int getAge() {
- return age;
- }
-
- public void setAge(int age) {
- this.age = age;
- }
-
- @Override
- public String toString() {
- return "User{" +
- "id=" + id +
- ", name='" + name + '\'' +
- ", age=" + age +
- '}';
- }
- }
开发小技巧:如何对三级分类列表进行封装?
stream加递归调用
注意排序的时候要注意排序是否为null
- @Override
- public List
listWithTree() { - //查出所有的分类
- List
entities = baseMapper.selectList(null); - //组装成父子的树形结构,使用stream来完成
- //过滤所有的一级分类并将其转换成list
- List
level1 = entities.stream().filter((categoryEntity) -> categoryEntity.getParentCid() == 0).map((menu) -> { - menu.setChildren(getChildren(menu, entities));
- return menu;
- }).sorted((menu1, menu2) -> { return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());}).collect(Collectors.toList());
- return level1;
- }
-
- //递归查找所有菜单的子菜单
- //找出root的所有子菜单的同时找到子菜单的子菜单,递归调用
- //核心在于通过过滤找到一级菜单的子菜单后,通过map流再次调用找子菜单的方法,以便找到所有的二级菜单的子菜单
- private List
getChildren(CategoryEntity root, List all) { - List
children = all.stream().filter(categoryEntity -> categoryEntity.getParentCid() == root.getCatId()).map((categoryEntity -> { - categoryEntity.setChildren(getChildren(categoryEntity, all));
- return categoryEntity;
- })).sorted((menu1, menu2) -> { return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());}).collect(Collectors.toList());
- return children;
- }