JDK1.8新特性 stream

提示: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 方法还有很多,后续再应用到的时候再补充当前博客,目前这两种使用的较多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值