13函数式编程&Stream流
13.1常用的函数式接口总结
| 接口名称 | 方法名称 | 抽象/默认 | 延迟/终结 | 方法描述 |
| Supplier | get | 抽象 | 终结 | 供给型接口,无参有返回值,主要用于 |
| Consumer | accept | 抽象 | 终结 | 消费型接口,有参数无返回值 |
| andThen | 默认 | 延迟 | ||
| Function | apply | 抽象 | 终结 | 函数型接口,有参数有返回值 |
| andThen | 默认 | 延迟 | ||
| compose | 默认 | 延迟 | ||
| Predicate | test | 抽象 | 终结 | 断言型接口,元芳你怎么看 |
| and | 默认 | 延迟 | ||
| or | 默认 | 延迟 |
| negate | 默认 | 延迟 |
13.2 Stream流
13.2.1 获取流的三种方式
public static void main(String[] args) {
// Collection 集合
Collection c = new ArrayList<String>();
Stream stream1 = c.stream();
System.out.println("stream1 = " + stream1);
// List 集合
ArrayList<String> list = new ArrayList<>();
Stream<String> stream2 = list.stream();
System.out.println("stream2 = " + stream2);
// Set 集合
HashSet<String> set = new HashSet<>();
Stream<String> stream3 = set.stream();
System.out.println("stream3 = " + stream3);
}
public static void main(String[] args) {
// Collection 集合
Collection c = new ArrayList<String>();
Stream stream1 = c.stream();
System.out.println("stream1 = " + stream1);
// List 集合
ArrayList<String> list = new ArrayList<>();
Stream<String> stream2 = list.stream();
System.out.println("stream2 = " + stream2);
// Set 集合
HashSet<String> set = new HashSet<>();
Stream<String> stream3 = set.stream();
System.out.println("stream3 = " + stream3);
}
Map集合
public static void main(String[] args) {
// Map 集合
HashMap<String, Integer> map = new HashMap<>();
// 获取流
// 1. keySet
Stream<String> stream1 = map.keySet().stream();
// 2. values
Stream<Integer> stream2 = map.values().stream();
// 3. entrySet
Stream<Map.Entry<String, Integer>> stream3 = map.entrySet().stream();
System.out.println("stream1 = " + stream1);
System.out.println("stream2 = " + stream2);
System.out.println("stream3 = " + stream3);
}
public static void main(String[] args) {
// Map 集合
HashMap<String, Integer> map = new HashMap<>();
// 获取流
// 1. keySet
Stream<String> stream1 = map.keySet().stream();
// 2. values
Stream<Integer> stream2 = map.values().stream();
// 3. entrySet
Stream<Map.Entry<String, Integer>> stream3 = map.entrySet().stream();
System.out.println("stream1 = " + stream1);
System.out.println("stream2 = " + stream2);
System.out.println("stream3 = " + stream3);
}
13.2.2 流的常用方法
终结方法:逐一处理:forEach,统计个数:count非终结方法:过滤:filter,取用前几个:limit,跳过前几个:skip,映射:map组合: 使用Stream接口的静态方法concat
| 方法名 | 方法作用 | 方法种类 | 是否支持链式调用 |
|---|---|---|---|
| count | 统计个数 | 终结 | 否 |
| forEach | 逐一处理 | 终结 | 否 |
| filter | 过滤 | 函数拼接 | 是 |
| limit | 取用前几个 | 函数拼接 | 是 |
| skip | 跳过前几个 | 函数拼接 | 是 |
| map | 映射 | 函数拼接 | 是 |
| concat | 组合 | 函数拼接 | 是 |
转换为并发流1. Stream的父接口java.util.stream.BaseStream中定义了一个parallel方法:
default Stream<E> parallelStream() {...}
Stream流提供collect方法,其参数需要一个java.util.stream.Collector<T,A, R>接口对象来指定收集到哪种集合中。幸运的是,java.util.stream.Collectors类提供一些方法,可以作为Collector接口的实例:
- public static <T> Collector<T, ?, List<T>> toList():转换为List集合。- public static <T> Collector<T, ?, Set<T>> toSet():转换为Set集合。
收集到数组中
Stream提供toArray方法来将结果放到一个数组中,由于泛型擦除的原因,返回值类型是Object[]的:
扩展:解决泛型数组问题
有了Lambda和方法引用之后,可以使用toArray方法的另一种重载形式传递一个IntFunction<A[]>的函数,继而从外面指定泛型参数。方法签名:
<A> A[] toArray(IntFunction<A[]> generator);有了它,上例代码中不再局限于Object[]结果,而可以得到String[]结果
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
13函数式编程&Stream流的更多相关文章
- 第46天学习打卡(四大函数式接口 Stream流式计算 ForkJoin 异步回调 JMM Volatile)
小结与扩展 池的最大的大小如何去设置! 了解:IO密集型,CPU密集型:(调优) //1.CPU密集型 几核就是几个线程 可以保持效率最高 //2.IO密集型判断你的程序中十分耗IO的线程,只要大于 ...
- JDK 8 新特性之函数式编程 → Stream API
开心一刻 今天和朋友们去K歌,看着这群年轻人一个个唱的贼嗨,不禁感慨道:年轻真好啊! 想到自己年轻的时候,那也是拿着麦克风不放的人 现在的我没那激情了,只喜欢坐在角落里,默默的听着他们唱,就连旁边的妹 ...
- 第十章 函数式接口&Stream流
10.1.函数式接口 10.1.1.概述 有且仅有一个抽象方法的接口,并且可以通过在类上标注@FunctionalInterface注解进行检测,建议自定义的函数式接口都加上这个注解 10.1.2.函 ...
- [三]java8 函数式编程Stream 概念深入理解 Stream 运行原理 Stream设计思路
Stream的概念定义 官方文档是永远的圣经~ 表格内容来自https://docs.oracle.com/javase/8/docs/api/ Package java.util.s ...
- Stream流式编程
Stream流式编程 Stream流 说到Stream便容易想到I/O Stream,而实际上,谁规定“流”就一定是“IO流”呢?在Java 8中,得益于Lambda所带来的函数式编程,引入了一个 ...
- 函数式接口与Stream流
lambda表达式是jdk8的特性.lambda表达式的准则是:可推断,可省略. 常规代码写一个多线程 public class Main { public static void main(Stri ...
- Java8函数式编程探秘
引子 将行为作为数据传递 怎样在一行代码里同时计算一个列表的和.最大值.最小值.平均值.元素个数.奇偶分组.指数.排序呢? 答案是思维反转!将行为作为数据传递. 文艺青年的代码如下所示: public ...
- 2020你还不会Java8新特性?方法引用详解及Stream 流介绍和操作方式详解(三)
方法引用详解 方法引用: method reference 方法引用实际上是Lambda表达式的一种语法糖 我们可以将方法引用看作是一个「函数指针」,function pointer 方法引用共分为4 ...
- 编程范式:命令式编程(Imperative)、声明式编程(Declarative)和函数式编程(Functional)
主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 命令式编程: 命令式编程的主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么. 比如:如果你想在一个数字集合 collec ...
随机推荐
- Android应用更新-自动检测版本及自动升级
原文 http://www.cnblogs.com/keyindex/articles/1819504.html 注:实质,把自己新版的APK放在可以下载的地方,先自己设置个通信,检查版本,我是直接放 ...
- mysql分表操作
一般分表操作有垂直拆分和水平拆分.顾名思义. 1. 垂直拆分是指,这个表的列,即字段,要拆分成两个或多个表. 这个应用场景比如:这个表字段,几个都是int.datetime等,有那么一个是text类 ...
- Linux_软件安装管理
开始学习rpm,yum等命令的使用,下面的地址可供你学习 大部分都大同小异! 感谢作者:https://segmentfault.com/a/1190000011200461
- Kafka基础系列第1讲:Kafka的诞生背景及应用
Kafka 是由 LinkedIn 开发的一个分布式的消息系统,使用 Scala 编写,它以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如 Cloudera.Apache Sto ...
- WPF 矩形框8个控制点伸缩及拖拽
最近在研发图片控件矩形框8个控制点进行控制边框的大小.位置等信息,之前查阅了相关的信息,比如别人整合的类:ControlResizer 这个类虽然是好,但是很大程度上是有限制,换句话说,它需要你二次更 ...
- 做完小程序项目、老板给我加了5k薪资~
大家好,我是苏南,今天要给大家分享的是最近公司做的一个小程序项目,过程中的一些好的总结和遇到的坑,希望能给其他攻城狮带来些许便利,更希望能做完之后老板给你加薪- 今天是中秋节的第一天,假日的清晨莫名的 ...
- oracle ocp视频教程笔记
show parameter user user_dump_dest string /u01/app/oracle/diag/rdbms/orcl/orcl/trace oracle日志存放位置d ...
- M2事后会议报告
设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? Beta阶段的爬虫需要更稳定.更高效.操作更便捷.在定义中爬取对性能和功能的要求高,典型用户和场景 ...
- 网络:OSPF理解
OSPF(开放最短路径优先)协议使用Dijkstra算法,常见的版本有:OSPFv2.OSPFv3等.以下主要介绍OSPFv2,OSPFv3是面向IPv6的且不兼容IPv4. 1.工作过程: 1)每台 ...
- 结对项目junit测试用例
题目:我们假设我们要写一个整数除法的类,并且给他写测试用例. 结对分工:滕娟负责写代码,搜集资料,整理,潘广玫负责进行测试,处理测试结果 github地址链接: https://github.com/ ...