内容简介:很早就想仔细学了,终于有机会记一下笔记……只定义了一个其实 Java 中就是一个接口实现,如果要扯到函数式编程的话就要扯到 lambda 演算,主要为三条规则:
很早就想仔细学了,终于有机会记一下笔记……
Lambda 表达式
函数式接口
只定义了一个 抽象 方法的的接口,值得注意的是,Java 8 引入了 stream 等方法,但是原先的 Collection 里没有。为了提高效率,接口的设计者就引入了 default 关键字来扩充接口。可用 @FunctionalInterface 标记为函数式接口,类似 @Override。
常用的接口
-
Predicate
返回 boolean -
Consumer
void,适用于sout
-
Function
可以将 T 转化为 R
感觉
其实 Java 中就是一个接口实现,如果要扯到函数式编程的话就要扯到 lambda 演算,主要为三条规则:
- 函数定义
- 标识符引用
- 函数应用
我的理解是这三条规则为定义一个变量和函数,然后告诉你定义完了怎么去使用它
举个难一点的栗子(PS:为什么要举难一点的例子……
)
(lambda x y. x y) (lambda z . z * z) 3
流
从支持数据处理操作的源生成的元素序列
用过的人都说好……
定义
-
内部迭代
将迭代封装在内部,例如
Dish.menu.stream().map(Dish::toString).collect(Collectors.toList()); Dish.menu.stream().forEach(System.out::println);
-
使用规则
- 数据源(例如集合)
- 中间操作链
- 终端操作
- 流只能遍历一次,只能消费一次
创建
// Stream.of Stream.of("Java 8", "Lambdas", "In", "Action").map(String::toUpperCase).forEach(System.out::println); // Stream.empty Stream<String> emptyStream = Stream.empty(); // Arrays.stream int[] numbers = {2, 3, 5, 7, 11, 13}; System.out.println(Arrays.stream(numbers).sum());
使用
筛选和切片
- filter
-
distinct
筛选互异元素 -
limit
取前几个元素 -
skip
跳过前几个元素
映射
- map
-
flatMap
将流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流,个人理解为将流里的值继续转换为子流然后连接。
List<Integer> list1 = Arrays.asList(1, 2, 3); List<Integer> list2 = Arrays.asList(4,5); list1.stream().flatMap(i-> list2.stream().map(j->new int[]{i,j}) ).forEach(t-> System.out.println(t[0]+","+t[1]));
-
mapToInt
查找和匹配
短路操作,找到一个符合条件的立即返回
-
anyMatch
至少匹配一个 -
allMatch
都匹配 -
noneMatch
没有匹配的 - findAny
-
findFirst
与楼上有并行的区别,findAny 不一定是返回第一个
规约
使用 reduce,第一个参数为初始值,第二个为执行函数直到规约到一个数
细节
-
数值流以及对象流相互的转化
- IntStream
- LongStream
-
DoubleStream
int calories = menu.stream().mapToInt(Dish::getCalories).sum(); menu.stream().mapToInt(Dish::getCalories).boxed();
-
数值范围
-
rangeClosed
long count = IntStream.rangeClosed(1, 100).filter(d -> d % 2 == 0).count();
-
range
不包括结束值
-
收集器
前面的都是小儿科,在开发人员的代码里很多都是收集器
规约与汇总
- counting
-
maxBy
需要实现 Comparator - summingInt/summingLong/summingDouble
- averagingInt/averagingLong/averagingDouble
- summarizingInt/summarizingLong/summarizingDouble
- joining
实现
通过 reducing() 实现,需要三参数,单参数为三参数的特殊情况,起点为第一个项目,转换函数为恒等函数,第三个为函数计算
menu.stream().map(Dish::getName).collect(joining()); menu.stream().map(Dish::getName).collect(reducing((s1,s2)->s1+s2)).get(); menu.stream().collect(reducing(" ",Dish::getName,(s1,s2)->s1+s2));
分组
groupingBy
- 单参数 groupingBy(f) 实际是 groupingBy(f,toList())
- 双参数,第二个参数为任意类型的收集器,也可为 groupingBy(f)
- 常用的联合使用收集器为 summingInt,counting,mapping 等
- 隐含参数可为 toSet()
分区
特殊的分组,分区函数返回 boolean
接口
Supplier<A> supplier() BiConsumer<A, T> accumulator() Function<A, List<T>>() BinaryOperator<A> combiner() Set<Characteristics> characteristics()
自定义收集器
单纯的能看懂……
并行
- 避免共享状态
- 留意装箱
- limit 和 findFirst 依赖元素顺序
PS:如果想提高效率,自行实现 Spliterator 接口
未完待续……
以上所述就是小编给大家介绍的《Java 8 实战》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 「Flask实战」鱼书项目实战一
- 「Flask实战」鱼书项目实战三
- 「Flask实战」鱼书项目实战四
- 「Flask实战」鱼书项目实战六
- RocketMQ实战系列从理论到实战
- 「Flask实战」flask鱼书项目实战二
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据结构、算法与应用(原书第2版)
Sartaj Sahni / 王立柱、刘志红 / 机械工业出版社 / 2015-4 / 79.00元
《数据结构、算法与应用——C++语言描述》是享有盛誉的数据结构教科书的第2版。它完整地包含了基本数据结构的内容,是CS2课程的理想用书。作者Sartaj Sahni通过循循善诱的讲解、直观具体的讨论和基于现实的应用,让读者轻松、愉快地学习。新版书着重利用标准模板库(STL),把书中开发的数据结构和算法与相应的STL实现方法相互关联。本书还增加了很多新的实例和练习题。 书中的应用实例是它的特色......一起来看看 《数据结构、算法与应用(原书第2版)》 这本书的介绍吧!