[首页]
[文章]
[教程]
首页
Web开发
Windows开发
编程语言
数据库技术
移动平台
系统服务
微信
设计
布布扣
其他
数据分析
首页
>
其他
> 详细
Test
时间:
2019-03-28 15:27:13
阅读:
144
评论:
0
收藏:
0
[点我收藏+]
Java8 函数式接口,方法传递与Lambda
Java8新特性
方法作为参数传递给方法,方法成为一等公民
Lambda,匿名函数
Stream API :
将一系列相关操作用流水线的思想分配到CPU的不同内核上并行操作,而不需要费劲的使用Thread实现
每个流就是一系列数据项,每个流能独立的完成已有的数据向,虽然流B的数据项是由流A生产,但是不需要等待流A完成所有数据项的生产,流A会把已经完成的数据向传给流B,好让流B同时工作
提倡数据分块而不是协调访问,就是说几个线程最好不要同时更新共享变量,尽量不用synchronized
Stream的并行特性必须保证传递给流的方法没有互动(比如有可变的共享变量)
函数式编程思想
默认方法,使接口更方便
Opthinal避免空指针异常
行为参数化 : 使代码从死板,罗嗦走向灵活,简洁
通过颜色,重量等条件筛选苹果的例子
方法1:条件作为参数传递给方法,死板,罗嗦
方法2:通过Filter接口与不同的实现类,将实现类作为参数,灵活但是罗嗦
方法3:通过匿名类来代替实现类,灵活但还是比较罗嗦
方法4:通过方法传递代替匿名类,灵活但还是有点罗嗦,但是如果方法已经存在,那这种方式就比Lambda简洁
方法5:通过Lambda表达式与函数式接口(只有一个抽象方法)代替方法传递,灵活并且简洁
扩展6:使用范型替代苹果,可以筛选基础类型以外的任何类型,接近完美
Java8函数式接口,方法传递与Lambda
@FunctionalInterface标注一个函数式接口
常用函数式接口
Predicate : T -> boolean
用于判断
test | and | or | negate
Function : T -> R
apply | andThen | compose
Consumer : T -> void
消费者,用于执行操作
accept | andThen
Supplier : () -> T
供应商
get
Compare
用于比较
compare | comparing | reversed | thenComparing
Lambda
Lambda是对函数式接口的简洁的实现方式
Lambda将java这种强类型,面向对象语言变得灵活,简洁
可以将Lambda赋值给一个函数式接口句柄
支持参数类型推断,可以省略参数类型
将Lambda运用于重载方法上的时候,重载方法的函数式接口的参数或者返回值不能相同,否则Lambda类型检查报错
Lambda实体内部可以使用局部变量,但是这个局部变量必须是final或者实际上是final的
(T t) -> U : 这个Lambda描述符可以用方法已有的方法传递代替
神奇的例子
将一个apple的List按重量排序
传统做法是自己写一个冒泡算法按重量排序
只对苹果List有效
只对苹果重量有效
需要自己实现算法
通过范型使得所有List有效
通过BiPredicate函数接口和Lambda解决重量限制
再将排序算法写入list,使得算法公用
通过以上我们可以对任何List按照自定义规则排序,近乎完美,但是我们仍不满足,是否能将Lambda也省略?也就是将排序规则省略,只通过给出的属性按照属性自己的比较规则排序。这样做的前提是给出的属性必须实现统一接口Comparable
Lambda嵌套:当一个函数式接口的几个参数是同一个类,并且实现方法里都是调用的这个类的同一个方法时,可以嵌套使用Function函数接口作为参数来构建这个函数式接口,这样做就可以使得实现方法也可以传递方法,并且可以减少参数,当然,不同类的参数也能嵌套
Stream
Stream 特性
流操作分为中间操作和终端操作,中间操作只有在终端操作被触发时才有效,这个理念类似于构建器模式
这种流水线理念的好处:可以通过循环合并,短路等技巧将中间操作合并处理,提高计算性能。
流只能被消费一次
Stream类
ReferencePipeline
mapToInt(ToIntFunction tf) :转换为数值流
数值流IntStream/DoubleStream/LongStream
boxed() : 转换为对象流
创建Stream
Stream.of :手动添加值
Arrays.stream(strs) :通过数组
Files.lines(Path path) : 通过文件
String.iterate(T seed, UnaryOperator f) : 迭代,无限流无法排序或者归约
Stream.generate(Math::random) : 生成,无限流
中间操作,通过一个流返回另一个流,组成流水线
筛选与切片
filter(Predicate p) : 按lambda提供的条件筛选
distinct() : 去重
limit(long maxSize) : 截断
skip(long n) : 跳过
映射
map(Function f) :获取流的特定规则的映射
flatMap(Function f) : 扁平化流
mapToInt(ToIntFunction tf) :转换为数值流
排序
sorted(Comparator c) :通过指定比较器排序
终端操作:返回一个非流
查找与匹配
anyMatch(Predicate p)
allMatch(Predicate p)
noneMach(Predicate p)
findFirst() : 查找第一个
findAny() : 查找任意一个,虽然findFirst也能实现,但是在并行流中建议使用findAny
归约
reduce(T identity, BinaryOperator
accumulator) :
对所有元素进行计算得出一个结果,比如获取最大最小值
与map合用便是著名的map-reduce模式
三个参数的reduce方法中间的参数相当于map的功能
collect(Collector c) : 返回一个集合, 参照Collectors
和reduce的区别?
其他
forEach(Consumer c) : 内部循环
count()
收集器
Collectors
分组
groupingBy(Function f)
groupingBy(Function f, Collector c) :多极分组/分组后归约
归约
Collectors.reducing(BinaryOperator bo) : 所有归约都是reducing的特殊化例子
toList()
counting()
maxBy/minBy(Comparator c)
averagingDouble/summingDouble(ToDoubleFunction f)
joining() : 连接字符串
google guava collections
思考
接口拥有了默认方法后,抽象类的意义何在
Lambda实体内部可以使用局部变量,但是这个局部变量必须是final或者实际上是final的?
List.sort()方法的源码分析
流的有状态和无状态
reduce和collect的区别
Test
原文:https://www.cnblogs.com/judesheng/p/10615072.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年09月23日 (328)
2021年09月24日 (313)
2021年09月17日 (191)
2021年09月15日 (369)
2021年09月16日 (411)
2021年09月13日 (439)
2021年09月11日 (398)
2021年09月12日 (393)
2021年09月10日 (160)
2021年09月08日 (222)
最新文章
更多>
2021/09/28 scripts
2022-05-27
vue自定义全局指令v-emoji限制input输入表情和特殊字符
2022-05-27
9.26学习总结
2022-05-27
vim操作
2022-05-27
深入理解计算机基础 第三章
2022-05-27
C++ string 作为形参与引用传递(转)
2022-05-27
python 加解密
2022-05-27
JavaScript-对象数组里根据id获取name,对象可能有children属性
2022-05-27
SQL语句——保持现有内容在后面增加内容
2022-05-27
virsh命令文档
2022-05-27
教程昨日排行
更多>
1.
list.reverse()
2.
Django Admin 管理工具
3.
AppML 案例模型
4.
HTML 标签列表(功能排序)
5.
HTML 颜色名
6.
HTML 语言代码
7.
jQuery 事件
8.
jEasyUI 创建分割按钮
9.
jEasyUI 创建复杂布局
10.
jEasyUI 创建简单窗口
友情链接
汇智网
PHP教程
插件网
关于我们
-
联系我们
-
留言反馈
- 联系我们:wmxa8@hotmail.com
© 2014
bubuko.com
版权所有
打开技术之扣,分享程序人生!