java8的新特性2

时间:2023-01-31 11:50:25

                                                 Java8四大核心函数式接口

Customer<T> :消费型接口  void accept(T t);

Supplier<T> :供己型接口 Tget();

Function<T,R> :函数式接口 R apply(T t);

predicate <T> :断言型接口(判断) boolean test(T t) ;

一、方法引用:若lambda体中的内容有方法已经实现,我们可以 “方法引用”(理解为方法一样是lambda表达式的另一种表现形式)

主要有三种{

对象:实例方法名

类:静态方法名

类:实例方法名

}

注:

1、lambda体的调用方法的参数列表与返回类型要与函数式接口的抽象方法的参数列表与返回类型一致

2、若lambda参数列表中第一参数是实例方法的调用者而第二个参数是实例方法的参数时,可以使用ClassName:method

二、构造器的引用

要调用构造器参数列表时与函数的参数列表一致

格式className::new

三数组的引用Type::new

                                                              StreamAPI

流(stream)是什么

是数据渠道,用于操作数据源所生成的元素序列。

集合讲的是数据,流讲的是计算

注意:Stream不会自己存储元素、stream不会改变源对象相反他们会返回一个持有新结果的stream流、stream操作是延迟执行的,意味着他们会等到需要结果的时候执行

                                                          stream流中间件

多中间件操作可以连接起来形成流水线,除非流水线上触发终止操作,否则中间操作不会执行任何处理:而终止操作时候一次全部处理称为“惰性求职”

  切片与筛选

方法:

filter(Predicate  p)接受lambda、从流中排出某些元素

distinct()刷选、通过流所生成的hashcode()和equals()去除某些重复元素

limit(long maxSize) 截断流、使元素不超出给定数量

skip(long n)跳过元素、返回一个扔掉前几个元素的流、若元素不足返回空流

映射

方法:

map(function f):接受一个函数作为参数,该函数会被应用到每一个元素上前将其映射为一个新的元素

mapToDouble (ToDoubleFunction f):j接受一个函数作为参数,该函数会被应用到每一个元素上,产生一个新的DoubleStream

mapToInt(ToIntFunction f):接受一个函数作为参数、该函数会被应用到每一个元素上面,产生一个新的IntStream

maoToLong(ToLonFunction f  ):接受一个函数作为参数、该函数会被应用到每个元素上,产生一个新的LongStream

flatmap(Function f) :接受一个函数作为参数,将流中每一个值都换成另一个流,然后把所有的流都连接成一个流

 排序

方法:

sorted():产生一个新的流,其按自然顺序排序

sorted(comparator cop):产生一个新的流,其按比较顺序排序

 查找与匹配

alllMath(Predictate p) :检查是否匹配所有元素

anyMatch(Predictate p):检查是否至少匹配一个元素

noneMatch(predictate p): 检查是否没有匹配所有元素

findFirst():返回第一个元素

findAny():返回任意一个元素

归约

reduce(T identity,BinaryOpeartor )将流中元素反复结合起来,得到一个值

收集

collect -将流转换为其他形式接受一个collector 的接口实现,用于stream做汇总方法。

                                      stream的终止操作

终端操作会从流的流水线生成,其结果可以是任何不是流的值

                                 并行流与串行流

                           Fork/Join框架(工作窃取模式)

在必要的情况下,将一个·大任务,进行拆分(fork)成若干个小人物(拆到不可拆)

再将一个个小任务运算的结果进行join汇总。

例:LongStream.rangeclosed(0,1000000000000l).parallel().reduce(0,Long::sum);

并行流把一个内容分成多块数据块,并将不同的线程分别对每一个数据块的流进行处理。StreamAPI可以通过parallel()与sequcatial()在并行流与顺序流之间进行切换

                                  optional类

Optional<T>类是一个容器类,代表一个值存在或者不存在

Optional.of(T t):创建一个Optional实例

Optional.empty();创建一个空的Optional实例

Optional.ofNullable<T t>若t不为null,创建optional实例,否则创建空实例

              isPresent();判断是否包含值。

               orelse(T t);如果对象包含值,返回该值,否则返回t

             orElseGet(Suplier s):如果调用对象,返回该值,否则返回获取去的值

             map(Function f)如果有值对其处理,并返回处理的Optional否则返回optional

             flatMap(Function mapper) : 与map类似放