13.1常用的函数式接口总结

 
接口名称 方法名称 抽象/默认  延迟/终结 方法描述
Supplier get 抽象 终结 供给型接口,无参有返回值,主要用于
Consumer accept 抽象 终结 消费型接口,有参数无返回值
  andThen 默认 延迟  
Function apply 抽象 终结 函数型接口,有参数有返回值
  andThen 默认 延迟  
  compose 默认 延迟  
Predicate test 抽象 终结 断言型接口,元芳你怎么看
  and 默认 延迟  
  or 默认 延迟  
  negate 默认 延迟  
notes:
        - 延迟方法:只是在拼接Lambda函数模型的方法,并不立即执行得到结果。
        - 终结方法:根据拼好的Lambda函数模型,立即执行得到结果值的方法。
 

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);
}
 
 
 
17
 
 
 
 
 
1
    public static void main(String[] args) {
2

3
        // Collection 集合
4
        Collection c = new ArrayList<String>();
5
        Stream stream1 = c.stream();
6
        System.out.println("stream1 = " + stream1);
7

8
        // List 集合
9
        ArrayList<String> list = new ArrayList<>();
10
        Stream<String> stream2 = list.stream();
11
        System.out.println("stream2 = " + stream2);
12

13
        // Set 集合
14
        HashSet<String> set = new HashSet<>();
15
        Stream<String> stream3 = set.stream();
16
        System.out.println("stream3 = " + stream3);
17
    }
 
 
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);
}
 
 
 
17
 
 
 
 
 
1
    public static void main(String[] args) {
2

3
        // Map 集合
4
        HashMap<String, Integer> map = new HashMap<>();
5

6
        // 获取流
7
        // 1. keySet
8
        Stream<String> stream1 = map.keySet().stream();
9
        // 2. values
10
        Stream<Integer> stream2 = map.values().stream();
11
        // 3. entrySet
12
        Stream<Map.Entry<String, Integer>> stream3 = map.entrySet().stream();
13

14
        System.out.println("stream1 = " + stream1);
15
        System.out.println("stream2 = " + stream2);
16
        System.out.println("stream3 = " + stream3);
17
    }
 
 
 
 

13.2.2 流的常用方法

                 - 终结方法:返回值类型不再是Stream接口自身类型的方法,因此不再支持类似StringBuilder那样的链式调用。本小节中,终结方法包括count和forEach方法。
               - 非终结方法:返回值类型仍然是Stream接口自身类型的方法,因此支持链式调用。(除了终结方法外,其余方法均为非终结方法。)
 
                终结方法:逐一处理:forEach,统计个数:count
                非终结方法:过滤:filter,取用前几个:limit,跳过前几个:skip,映射:map
               组合: 使用Stream接口的静态方法concat
方法名 方法作用 方法种类 是否支持链式调用
count 统计个数 终结
forEach 逐一处理 终结
filter 过滤 函数拼接
limit 取用前几个 函数拼接
skip 跳过前几个 函数拼接
map 映射 函数拼接
concat 组合 函数拼接
 
                    并发流:
                    转换为并发流
                   1. Stream的父接口java.util.stream.BaseStream中定义了一个parallel方法:
                            2.在通过集合获取流时,也可以直接调用parallelStream方法来直接获取支持并发操作的流
                             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流的更多相关文章

  1. 第46天学习打卡(四大函数式接口 Stream流式计算 ForkJoin 异步回调 JMM Volatile)

    小结与扩展 池的最大的大小如何去设置! 了解:IO密集型,CPU密集型:(调优)  //1.CPU密集型 几核就是几个线程 可以保持效率最高 //2.IO密集型判断你的程序中十分耗IO的线程,只要大于 ...

  2. JDK 8 新特性之函数式编程 → Stream API

    开心一刻 今天和朋友们去K歌,看着这群年轻人一个个唱的贼嗨,不禁感慨道:年轻真好啊! 想到自己年轻的时候,那也是拿着麦克风不放的人 现在的我没那激情了,只喜欢坐在角落里,默默的听着他们唱,就连旁边的妹 ...

  3. 第十章 函数式接口&Stream流

    10.1.函数式接口 10.1.1.概述 有且仅有一个抽象方法的接口,并且可以通过在类上标注@FunctionalInterface注解进行检测,建议自定义的函数式接口都加上这个注解 10.1.2.函 ...

  4. [三]java8 函数式编程Stream 概念深入理解 Stream 运行原理 Stream设计思路

    Stream的概念定义   官方文档是永远的圣经~     表格内容来自https://docs.oracle.com/javase/8/docs/api/   Package java.util.s ...

  5. Stream流式编程

    Stream流式编程   Stream流 说到Stream便容易想到I/O Stream,而实际上,谁规定“流”就一定是“IO流”呢?在Java 8中,得益于Lambda所带来的函数式编程,引入了一个 ...

  6. 函数式接口与Stream流

    lambda表达式是jdk8的特性.lambda表达式的准则是:可推断,可省略. 常规代码写一个多线程 public class Main { public static void main(Stri ...

  7. Java8函数式编程探秘

    引子 将行为作为数据传递 怎样在一行代码里同时计算一个列表的和.最大值.最小值.平均值.元素个数.奇偶分组.指数.排序呢? 答案是思维反转!将行为作为数据传递. 文艺青年的代码如下所示: public ...

  8. 2020你还不会Java8新特性?方法引用详解及Stream 流介绍和操作方式详解(三)

    方法引用详解 方法引用: method reference 方法引用实际上是Lambda表达式的一种语法糖 我们可以将方法引用看作是一个「函数指针」,function pointer 方法引用共分为4 ...

  9. 编程范式:命令式编程(Imperative)、声明式编程(Declarative)和函数式编程(Functional)

    主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 命令式编程: 命令式编程的主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么. 比如:如果你想在一个数字集合 collec ...

随机推荐

  1. AI 最小二乘法

    最小二乘法 参考链接: https://zhuanlan.zhihu.com/p/27204466

  2. SQL 行转列 列转行 PIVOT UNPIVOT

    1.基础表 2.行转列,注意ISNULL函数的使用,在总成绩的统计中,ISNULL(-,0) 有必要使用 3.列转行,对列语文.数学.英语.政治,进行列转行,转为了2列,score scname 这两 ...

  3. MongoDB的一些CURD操作

    MongoDB的一些增删改查命令操作: 官方文档参考  https://docs.mongodb.com/manual/reference/method/ https://docs.mongodb.c ...

  4. springbootAdmin+eureka集群+swagger

    请移步githubb下载源码.知识共享.(https://github.com/yivvonllh) 或者直接git下载(https://github.com/yivvonllh/spring-clo ...

  5. CF487E Tourists 圆方树、树链剖分

    传送门 注意到我们需要求的是两点之间所有简单路径中最小值的最小值,那么对于一个点双联通分量来说,如果要经过它,则一定会经过这个点双联通分量里权值最小的点 注意:这里不能缩边双联通分量,样例\(2\)就 ...

  6. ES6-课程介绍

    ES6 可以提高开发效率,把ES3比做斧头,ES5比做锯子,那么ES6就是电锯. ES6新特性 默认参数.字符串模板.结构赋值.箭头函数.set\mat .异步操作.类和对象 .模块化

  7. 一个可爱 & 小清新的加载等待Android控件

    https://github.com/Carson-Ho/Kawaii_LoadingView

  8. linux配置iptables(3)

    简单通用 web 服务器iptables 配置 *filter :INPUT DROP [0:0]:FORWARD DROP [0:0]:OUTPUT ACCEPT [0:0] #超出 链规则 的数据 ...

  9. [Oacle][Partition]Partition操作与 Index, Global Index 的关系

    [Oacle][Partition]Partition操作与 Index, Global Index 的关系: ■ Regarding the local index and the global i ...

  10. Jumpserver双机高可用环境部署笔记

    之前在IDC部署了Jumpserver堡垒机环境,作为登陆线上服务器的统一入口.后面运行一段时间后,发现Jumpserver服务器的CPU负载使用率高达80%以上,主要是python程序对CPU的消耗 ...