Stream流

作用:

将对象转Stream流 再对流数据进行操作 过滤/修改等操作

 

Stream流基本都用到函数式接口

配合lambda简化代码

 

例子

@Data
@AllArgsConstructor
public class Juc6 {
    int id;
    int age;
    String name;
}

class StreamTest{
    public static void main(String[] args) {
        Juc6 u1 = new Juc6(1,21,"a");
        Juc6 u2 = new Juc6(2,22,"b");
        Juc6 u3 = new Juc6(3,23,"c");
        Juc6 u4 = new Juc6(4,24,"d");
        List<Juc6> list = Arrays.asList(u1,u2,u3,u4);
        //交给Stream流计算
        list.stream().
                filter((u)->{return u.getId()%2==0;})//过滤对象
                .filter((u)->{return u.getAge()>21;})
                .map((u)->{u.setName(u.getName().toUpperCase());
                    return u;})//对对象数据操作
                .sorted((uu1,uu2)->{return uu2.getName().compareTo(uu1.getName());})//排序
                .limit(1) //分页
                .forEach((e)->{ System.out.println(e); });//打印
    }
}

 

点开源码进行代码分析

list.stream()   将list转stream流

//下面都需要点开源码分析
filter  //filter过滤 
    Stream<T> filter(Predicate<? super T> predicate);
    发现入参是Predicate 是一个函数式接口
    若忘记参数怎么定义再点开 看到该函数式接口方法是boolean test(T t);
    即可用lambda表达式中方法体返回boolen 来过滤对象


map
    <R> Stream<R> map(Function<? super T, ? extends R> mapper);
    同是函数接口Function
    点开Function 看到方法是R apply(T t);
    即可用lambda表达式中方法体出传入参数 自己对数据处理 后再返回
   //如 .map((u)->{u.setName(u.getName().toUpperCase());
                    return u;})//对对象数据操作


sorted    //排序
    函数式接口Comparator
    方法是int compare(T o1, T o2);
    即需定义2个入参
    //如上 .sorted((uu1,uu2)->{return uu2.getName().compareTo(uu1.getName());})//排序


forEach
    函数式接口Consumer
    方法void accept(T t);
    只有入参 没有返回值
    //如上  .forEach((e)->{ System.out.println(e); })

 

posted @ 2021-01-31 22:06  小白小白小白小白  阅读(74)  评论(0编辑  收藏  举报