提示:stream api 一些简单操作
前言
stream 出来蛮久了,本文对stream api 做一些简单记录,和中间用到的参数做一些基础说明和理解
一、什么是 stream ?
java 里边是这么描述的
A sequence of elements supporting sequential and parallel aggregate operations.
支持顺序和并行聚合操作的元素序列。
中间操作 (intermediate operations)
中间操作(Intermediate operations)中间操作只是对操作进行了记录,并不会做计算;
所有返回Stream 的方法都属于中间操作,常见的有一下几种:
R collect(Supplier supplier, ObjDoubleConsumer accumulator, BiConsumer<R,R> combiner)
Supplier :函数式接口,代表结果的提供者,其方法为 get(), T - 该供应商提供的结果类型
BiConsumer<T,U>:函数式接口,表示接受两个输入参数并且不返回结果的操作 其方法为 accept(Object, Object)。T - 操作的第一个参数的类型,U - 操作的第二个参数的类型
R collect(Supplier supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner)
对此流的元素执行mutable reduction操作。 可变减少是其中减少的值是可变结果容器(例如ArrayList ,并且通过更新结果的状态而不是通过替换结果来合并元素。 这产生的结果相当于:
R result = supplier.get(); for (T element : this stream) accumulator.accept(result, element); return result;
与reduce(Object, BinaryOperator)类似 ,可以并行化collect操作,而无需额外的同步。
这是一个terminal operation 。
Stream map(Function<? super T, ? extends R> mapper)
Function<T, R>:函数式接口,表示接受一个参数并生成结果的函数。 T - 函数输入的类型,R - 函数结果的类型
返回一个流,该流包含将给定函数应用于此流的元素的结果,map 更常见对集合中某个字段做一些操作。
Stream filter(Predicate<? super T> predicate)
Predicate: 断言 T,表示断言的方法,由调用方实现,断言为true 的元素则记录到stream 里边。其功能方法是 boolean test(T t);
结束操作 (terminal operation)
只有结束操作才会触发实际的计算(即惰性求值)
二、常见用法
1. collect() 方法
// 准备一个集合,并对集合
List<User> users = new ArrayList<>();
User user = new User(1, "as",12);
User user1 = new User(1, "pp",6);
User user3 = new User(2, "rt",1);
User user4 = new User(3, "pr",0);
users.add(user);
users.add(user1);
users.add(user3);
users.add(user4);
// 将 users 转为使用 HashSet 存储
HashSet<User> collect1 = users.stream().collect(HashSet::new, HashSet<User>::add, HashSet<User>::addAll); //提供者new,累加器(add)accumulator,组合(addAll)combiner
//对所有 user 的年龄求和
Integer sum = users.stream().collect(Collectors.summingInt(User::getAge));
/**
* 要求: 将users 根据id 分组求出id 所对应年龄的 sum
* notes: Collector<T, ?, Map<K, D>> groupingBy(Function<? super T, ? extends K>,Collector<? super T, A, D> downstream)
* <T>输入元素的类型
* <K>键的类型
* <A>下游收集器的中间累积类型
* <D>下游还原的结果类型
*/
Map<String,Integer> collect = users.stream().collect(Collectors.groupingBy(User::getId, Collectors.summingInt(User::getAge)));
2. map() 用法
map 中间的操作不会改变源数据,只是改变当前(中间)这个阶段的值;
/**
* 要求:对users 里边的名字要求全大写
* @Notes map 中间的操作不会改变源数据 既users 里边的Name值 不会变的大写,除非 将值collect 进入另一个list 中,map 只是改变当前这个阶段
* 的值。
*/
users.stream().map(vo->vo.getName().toUpperCase()).forEach(System.out::println); // 打印结果: name 全大写
总结
stream 方法还有很多,后续再应用到的时候再补充当前博客,目前这两种使用的较多。