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. java中使用阻塞队列实现生产这与消费这之间的关系

    需求如下: 有一个生产者和一个消费者,生产者不断的生产产品,消费这不断的消费产品.产品总数为N. 1.生产顺序按队列的方式,先进先出. 2.生产者和消费这可以同时进行. 3.当生产者生产了N个产品后不 ...

  2. 7、存储类 & 作用域 & 生命周期 & 链接属性

    概念解析 存储类 存储类就是存储类型,也就是描述C语言变量在何种地方存储. 内存有多种管理方法:栈.堆.数据段.bss段..text段······一个变量的存储类属性就是描述这个变量存储在何种内存段中 ...

  3. grep配置颜色显示

    查日志时候必须要用的命令,为了在终端方便显示查看,可以加颜色和高亮等设置. 自己习惯用的: GREP_COLOR='a;b'  a=4表示下划线,b=41表示红色背景高亮 在~/.bashrc文件中加 ...

  4. token令牌

    本文摘自 WebApi安全性 使用TOKEN+签名验证 首先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或 ...

  5. LOJ2803 CCC2018 平衡树 数论分块、记忆化搜索

    传送门 题意差评,其实就是一个递推式:\(f_1 = 1 , f_i = \sum\limits_{j=2}^i f_{\lfloor \frac{i}{j} \rfloor}\),然后求\(f_N\ ...

  6. React-使用styled-components

    1.安装 npm install --save styled-components 2.简单使用 style.js: import styled from 'styled-components'; i ...

  7. JVM调优-GC参数

    一.Throughput收集器(吞吐量)-XX:+UseParallelGC-XX:+UseParallelOldGC *参数调整:通过调整堆大小,减少GC停顿时间,增大吞吐量增强堆大小可以减少Ful ...

  8. synchronized和Lock的异同

    JAVA语言使用两种机制来实现堆某种共享资源的同步,synchronized和Lock.其中,synchronized使用Object对象本身的notify.wait.notifyAll调度机制,而l ...

  9. Express中间件,看这篇文章就够了(#^.^#)

    底层:http模块 express目前是最流行的基于Node.js的web开发框架,express框架建立在内置的http模块上, var http = require('http') var app ...

  10. Jq_DOM元素方法跟JQuery 核心函数跟JQuery 事件方法

    JQuery DOM 元素 函数                            描述 .get()                           从队列中删除所有未运行的项目. .ind ...