使用stream流来对结果进行计算

java.util.stream包下有一个Stream接口,有很多实用的方法,常用的几个:

Stream<T> filter(Predicate<? super T> predicate)返回由与此给定谓词匹配的此流的元素组成的流。
<R> Stream<R> map(Function<? super T,? extends R> mapper)返回由给定函数应用于此流的元素的结果组成的流。
Stream<T> sorted()返回由此流的元素组成的流,根据自然顺序排序。
Stream<T> sorted(Comparator<? super T> comparator)返回由该流的元素组成的流,根据提供的 Comparator进行排序。
Stream<T> limit(long maxSize)返回由此流的元素组成的流,截短长度不能超过 maxSize 。
思考题:一分钟内完成此题,只能用一行代码实现!
现在有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<User> 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<String> c1 = System.out::println;等价于
        //Consumer<String> 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<CategoryEntity> listWithTree() {
        //查出所有的分类
        List<CategoryEntity> entities = baseMapper.selectList(null);
        //组装成父子的树形结构,使用stream来完成
        //过滤所有的一级分类并将其转换成list
        List<CategoryEntity> 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<CategoryEntity> getChildren(CategoryEntity root, List<CategoryEntity> all) {
        List<CategoryEntity> 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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值