jdk1.8简单梳理

匿名对象->Lambda表达式(必须是函数式接口)->方法引用

1.方法引用:
可以看作是Lambda表达式的简化形式。
主要有三类:
1)指向静态方法的方法引用
2)指向任意类型实例方法的方法引用
3)指向现有对象的实例方法的方法引用
4)构造函数引用 (类名::new)


2.流-Strem以声明式的方式处理数据集合
流的定义:从支持数据处理操作的源(集合、数组或输入/输出资源)生成的元素序列

流的特征:
元素序列:流是元素序列,且只能被消费一次
源:集合、数组或输入/输出资源,Arrays.stream(array)
数据处理操作:filter 、map等
流水线:很多方法会返回流如filter
内部迭代:迭代操作被封装到内部了

集合和流:流中的元素是按需计算的    
集合:主要用于元素的存储和访问
流:主要是表达计算
1)流只能被消费一次,集合没有限制
2)流是内部迭代,集合是外部迭代(自己写代码)

流操作:建造者模式
1)中间操作,会返回流
2)终端操作,会触发中间操作并生成结果
流的使用总结:
一个数据源(如集合)来执行一个查询。
一个中间操作链形成一条流的流水线。
一个终端操作执行流水线并生成结果。


3.流的中间操作和终端操作
筛选和切片-中间
filter(Predict):接受一个谓词,返回一个符合谓词(true)的元素的流。
distinct():返回一个元素各异的流(元素的hashcode和equals方法实现)。
limit(n):返回一个不超过给定长度的流。流可以是有序的,也可以是无序的。
skip(n):返回一个扔掉前n个元素的流。

映射-中间
map(Function<T,R>):从对象中选择信息形成的流。
flatMap(Function<T,Stream<R>>):flatmap 方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流。

查询和匹配(短路)-终端
allMatch(Predicate):所有元素都符合条件
anyMatch(Predicate):只有有一个元素符合条件
noneMatch(Predicate):没有一个元素符合条件

findFirst():返回流中的第一个元素
findAny():返回当前流的任意一个元素

归约-终端:
reduce(T,BinaryOperator):元素求和,第一个参数是类和初始值,BinaryOperator是求和函数;求最大值、求最小值

4.原始类型流-数值流
IntStream、LongStream、DoubleStream
免去了装箱和拆箱的消耗,提升性能。支持sum、average等更个性化的方法。
一般流和原始类型流的转换:
IntStream intStream = menu.stream().mapToInt(Dish::getCalories);
Stream<Integer> stream = intStream.boxed();
示例:如何生成一组勾股数?

5.构建流
如何生成流?
1)由值创建流:Stream.of(T)
2)从数组中创建流:Arrays.stream(array)
3)由文件生成流:Stream<String> lines = Files.lines(path,charset),文件中的一行可以看成是流中的一个元素
4)由函数生成流: Stream.iterate 和 Stream.generate可以创建无限流,用给定的函数按需创建值(这是和集合的一个区别), 
limit(n) 来对这种流加以限制。
Stream.iterate(t,UnaryOperator):第一个是初始值,第二个参数是Function<T, T>的实现类
Stream.generate(Supplier<T>):Stream.generate(Math::random)

6.用流收集数据
概念:
collect(数据收集方法)、Collector(收集器)、Collectors(工厂类,返回Collector接口)

收集器Collector
有现成的api接口,使用现有的。
常用的工厂类方法:
Collectors.toList(): 将流转换为list
Collectors.toSet():将流转换为Set
Collectors.groupingBy():对流进行分组
Collectors.partitioningBy():对流进行分区,即特殊的分组。

7.并行流
定义:并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。
底层:java7引入的分支/合并框架。
重点:合理地划分数据块Spliterator

1.关注点:并发时避免有共享值即数据同步问题
1)测量,比较性能。
2)留意装箱,装箱拆箱的消耗不容忽视,使用LongStream、IntStream、DoubleStream
3)有些操作在并行流中的性能比顺序流差。
4)小数据量时使用顺序流。
5)考虑流的操作流水线的总计算成本。比如N为流中元素个数,Q为一个元素通过流程线的消耗,N*Q为总的消耗,
那么N*Q越大采用并行的效果越好。
6)流背后的数据结构是否易于分解。

2.分支/合并框架
有点难

3.Spliterator(splitable-iterator)
可分迭代器
有点难

8.Optional的使用
optional:可选择的,代表可有可没有。
静态工厂方法:empty、of、ofNullable(推荐) 分别为创建一个空值Optional、非空Optional、任意Optional
类似于Stream的方法:map(返回Optional<Optional<T>>)、flatMap(用于解引用,返回Optional<T>)、filter
值获取:orElse(推荐,默认值)、get(不友好,空值会报错)、orElseGet(Supplier 生产者)
基础类型Optional: 不推荐,没有map等方法。如OptionalInt、OptionalLong、 OptionalDouble
编码建议:
1)使用Optional封装可能的null值。
2)灵活使用map、flatMap、filter方法
3)积极使用Optional,让代码更优雅

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值