13.Stream流

函数式接口不光有supplier接口、consumer接口,还有以下:

Predicate

  1. 表示条件判断

可以用Java.Util.functiion.Predicate<T>接口

  1. 抽象方法:

                   Test: 测试:参数代表需要对什么数据进行检测,返回值是boolean值。

  1. 默认方法:
    1. And   并且:两者条件必须都满足,“并且”---而且里面lambda的延迟加载的效果在里面。

 

    1. Or    或者—与上面相反,两者满足其中一个

    1. Nagate    取反,就是将本来的规则变成相反的样子

  1. Practice

function

java.util.function.function<T,R>接口本身就是一个函数,有一个进去的数据,还有一个出来的数据。根据x拿y.

接口用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件,后者称为后置条件。有进有出,所以称为“函数Function”。

1.      抽象方法:

apply     应用执行

Function 接口中最主要的抽象方法为:R apply(T t) ,根据类型T的参数获取类型R的结果。使用的场景例如:将String 类型转换为Integer 类型。

2.      默认方法:

                   a).    andthen  两个函数拼接成一个大函数,

按照先后顺序   a.andThen(b) 先A后B

b).    compose  两个函数拼接成一个大函数,按照先后倒序,

a.compose(b)  先b后a,因为用这比较奇葩,所以不经常用。

                  c)      Consumer与function中andThen的区别:

3.      practce

 

常用函数式接口总结

流的方法分为:延迟拼接与终结方法

Stream流

  1. 概念

有点那种 传送带 的感觉,它是lambda的衍生物

Java.UtilStream<T>.接口表示一个Java 8 的流,不是IO流。

  1. 获取Stream流的三种方式
    1. 通过传统集合获取流,直接调用 .stream 流。

    1. Map映射间接获取流:

Map当中存储的不是一个一个的对象,而是一对儿一对儿的对象。
不能直接Map获取流,只能间接:

      1. 所有的键 map.keySet().stream()
      2. 所有的值:map.values().stream()
      3. 通过所有的键值对,map.entrySet().stream()
    1. 数组获取流
      1. 通过Stream接口的静态方法of    Stream.of()
      2. 通过Arrays工具类的静态方法stream   Arrays.Stream([ ]);

3.常用的流操作

a)     filter如果希望对流当中的元素进行筛选,可以用filter方法。

Stream filter(Predicate predicate):参数是一个筛选的条件。

备注:每次Stream filter 当中的函数模型拼接方法调用(例如filter),都会返回一个新的Stream流。

 

b).    count 当中想要获取元素的个数,应该使用count方法,得到long值。

有点类似集合的size的方法。

c).      limit对流进行截取,只要前几个,使用limit方法。

Steream limit(long maxSize);

Limit是最大限度,没有规定必须一定是多少。

d).      skip跳过流当中的前几个,可以用skip方法。

Stream skip(int n);

e).      map本来Stream<String> 装的都是字符串,转换成为String<Integer>,里面都是数字

这时候可以使用map方法,将每一个字符串都映射到数字身上。String—>Integer

map方法的参数是一个Function<T, R>接口,代表如何进行映射的规则。

第一个泛型代表本来的数据是什么类型

第二个泛型代表后来的数据是什么类型

f).Contact如果希望两个流合并成为一个整体,那么使用concat方法。
这是Stream接口当中的静态方法,有两个参数。

不是a.concat(b),而应该是Stream.concat(a, b)

g).forEach如果希望对流当中的元素进行遍历逐一消费(例如打印),那么可以使用forEach方法。参数是一个Consumer接口。

使用Stream流注意事项

1.      Stream和StringBuilder 不一样:

a).      StringBuilder例如append等方法,

b).     Stream流虽然也返回接口自身类型

c).   Stream流是一次性使用的,不能二次使用。IllegalStateException异常。                   
  1. Stream当中的并发操作
    1. 直接获取并发流调用.parallelStream()方法
    2. 已经有了一个普通的流,变成并发的流:后续调用.parallel()方法
  2. 将流当中的数据收集到集合当中

只需要调用Stream接口当中的.collection(Collector collector)方法。

常用的集合就是List和set

Collevtions提供了两个方法

  1. Collectors.toList();
  2. Collectors.toSet();

  1. 将流的结果收集到数组里。
    1. 直接使用toArray()方法得到Object[]。
    2. 通过.toArray(数组构造器引用),得到指定类型数组。

  1. Practice

扩展:spliterrator

为什么用并发流而不用锁?

并发流是分而自治

因为并发流供Stream底层使用的原理是Java7当中的ForkJoinPool.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值