Java8

Java8新特性的好处

  1. 速度更快
  2. 代码更少(Lambda简化代码书写)
  3. 强大的Stream API(我就是冲着它来的,真滴好用)
  4. 便于并行
  5. 最大化减少空指针异常:Optional
  6. Nashorn引擎,允许在JVM上运行JS应用

并行流与串行流

  • 并行流就是把一个内容分为多个数据块,并用不同的线程分别处理每个数据块的流,相比较于串行流,可以很大程度上提高程序的执行效率
  • Java8中将其进行了优化,我们可以很容易的对数据进行并行操作。
  • Stream API 可以声明性地通过parallel()和sequential()在并行流与顺序流之间进行切换

Lambda表达式

  • Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。
  • 使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,是Java的语言表达能力得到了提升
  • 没有名称,但有参数列表、函数主体、返回类型

函数式接口

  • Lambda表达式的本质:作为函数式接口的实例
  • 如果在一个接口中,只声明了一个抽象方法,则此接口就被称为函数式接口,我们可以在一个接口上使用@FunctionalInterface注解来验证该接口是否为函数式接口(如果你在该接口中写了两个方法,则编译期就会报错)
  • 正是因为抽象方法中只有一个方法,所以我们才可以省略@Override函数声明等内容
函数式接口参数类型返回类型用途
Consumer 消费型接口Tvoid对类型为T的对象应用操作,包含方法:void accept(T t)
Supplier 供给型接口T返回类型为T的对象,包含方法:T get()
Function函数型接口TR对类型为T的对象应用操作,并返回结果。结果是R类型的对象。包含方法:R apply(T t)
Predicate断定型接口Tboolean确定类型为T的对象是否满足某约束,并返回boolean 值。包含方法:boolean test(T t)
BiFunctionT, UR对类型为T,U参数应用操作,返回R类型的结果。包含方法为:Rapply(T t,U u);
UnaryOperator(Function子接口)TT对类型为T的对象进行一元运算,并返回T类型的结果。包含方法为:Tapply(T t);
BinaryOperator(BiFunction子接口)T,TT对类型为T的对象进行二元运算,并返回T类型的结果。包含方法为:Tapply(T t1,T t2);
BiConsumerT,Uvoid对类型为T,U参数应用操作。包含方法为:voidaccept(Tt,Uu)
BiPredicateT,Uboolean包含方法为:booleantest(Tt,Uu)
ToIntFunctionTint计算int值的函数
ToLongFunctionT long计算long值的函数
ToDoubleFunctionTdouble计算double值的函数
IntFunctionintR参数为int类型的函数
LongFunctionlongR参数为long类型的函数
DoubleFunctiondoubleR参数为double类型的函数

方法引用和构造器引用

  • 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用
  • 方法引用可以看做会Lambda表达式的深层次表达,换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖
  • 要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致
  • 格式:使用操作符::将类或对象与方法名分割开来
  • 有如下三种使用情况
    1. 对象::实例方法名
    2. 类::静态方法名
    3. 类::实例方法名

Stream API

  1. Stream 关注的是对数据的运算,与CPU 打交道;
    集合关注的是数据的存储,与内存打交道
  2. Stream 自己不会存储数据;
    Stream 不会改变源对象,相反,他们会返回一个持有结果的新Stream
    Stream 操作是延迟执行的,这意味着他们会等到需要结果的时候才执行
  3. Stream 执行流程
    • Stream实例化
    • 一系列中间操作(过滤、映射、…)
    • 终止操作
  4. 说明
    • 一系列中间操作连,对数据源的数据进行处理
    • 一旦执行终止操作,就执行中间操作连,并产生结果,之后,不会再被使用

Stream的中间操作:筛选与切片

方法描述
filter(Predicate p)接收Lambda ,从流中排除某些元素
distinct()筛选,通过流所生成元素的hashCode() 和equals() 去除重复元素
limit(long maxSize)截断流,使其元素不超过给定数量
skip(long n)跳过元素,返回一个扔掉了前n 个元素的流。若流中元素不足n 个,则返回一个空流。与limit(n)互补

Stream的中间操作:映射

方法描述
map(Function f)接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
mapToDouble(ToDoubleFunction f)接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的DoubleStream。
mapToInt(ToIntFunction f)接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的IntStream。
mapToLong(ToLongFunction f)接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的LongStream。
flatMap(Function f)接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流

Stream的中间操作:排序

方法描述
sorted()产生一个新流,其中按自然顺序排序
sorted(Comparator com)产生一个新流,其中按比较器顺序排序

Stream的终止操作:匹配与查找

  • 终端操作会从流的流水线生成结果。其结果可以是任何不是流的值,例如:List、Integer,甚至是void 。
  • 流进行了终止操作后,不能再次使用。
方法描述
allMatch(Predicate p)检查是否匹配所有元素
anyMatch(Predicate p)检查是否至少匹配一个元素
noneMatch(Predicate p)检查是否没有匹配所有元素
findFirst()返回第一个元素
findAny()返回当前流中的任意元素
count()返回流中元素总数
max(Comparator c)返回流中最大值
min(Comparator c)返回流中最小值
forEach(Consumer c)内部迭代(使用Collection 接口需要用户去做迭代,称为外部迭代。相反,Stream API 使用内部迭代——它帮你把迭代做了)

Stream的终止操作:归约

方法描述
reduce(T iden, BinaryOperator b)可以将流中元素反复结合起来,得到一个值。返回T
reduce(BinaryOperator b)可以将流中元素反复结合起来,得到一个值。返回Optional

Stream的终止操作:收集

方法描述
collect(Collector c)将流转换为其他形式。接收一个Collector接口的实现,用于给Stream中元素做汇总的方法

Collector 接口中方法的实现决定了如何对流执行收集的操作(如收集到List、Set、Map)。

Collectors实用类提供了很多静态方法,可以方便地创建常见收集器实例,具体方法与实例如下表:

方法返回类型作用
toListList把流中元素收集到List
toSetList把流中元素收集到List
toCollectionCollection把流中元素收集到创建的集合
countingLong计算流中元素的个数
summinglntInteger对流中元素的整数属性求和
averagingIntDouble计算流中元素Integer属性的平均值
summarizinglntIntSummaryStatistics收集流中Integer属性的统计值。如:平均值
joiningString连接流中每个字符串
maxByOptional根据比较器选择最大值
minByOptional根据比较器选择最小值
reducing归约产生的类型从一个作为累加器的初始值开始,利用BinaryOperator与流中元素逐个结合,从而归约成单个值
collectingAndThen转换函数返回的类型包裹另一个收集器,对其结果转换函数
groupingByMap<K, List>根据某属性值对流分组,属性为K,结果为V
partitioningByMap<Boolean,List>根据true或false进行分区
List<Employee> emps= list.stream().collect(Collectors.toList());

Set<Employee> emps= list.stream().collect(Collectors.toSet());

Collection<Employee> emps =list.stream().collect(Collectors.toCollection(ArrayList::new));

long count = list.stream().collect(Collectors.counting());

int total=list.stream().collect(Collectors.summingInt(Employee::getSalary));

double avg = list.stream().collect(Collectors.averagingInt(Employee::getSalary));

int SummaryStatisticsiss=list.stream().collect(Collectors.summarizingInt(Employee::getSalary));

String str= list.stream().map(Employee::getName).collect(Collectors.joining());
optional<Emp>max=list.stream().collect(Collectors.maxBy(comparingInt(Employee::getSalary));

Optional<Emp>min = list.stream().collect(Collectors.minBy(comparingInt(Employee::getSalary));

int total=list.stream().collect(Collectors.reducing(0, Employe::getSalar, Integer::sum));

int how= list.stream().collect(Collectors.collectingAndThen(Collectors.toList(), List::size));

Map<Emp.Status, List<Emp>>map= list.stream().collect(Collectors.groupingBy(Employee::getStatus));

Map<Boolean,List<Emp>>vd=list.stream().collect(Collectors.partitioningBy(Employee::getManage));

Optional类

  • Optional 类(java.util.Optional) 是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。原来用null 表示一个值不存在,现在Optional 可以更好的表达这个概念。并且可以避免空指针异常。

  • Optional类的Javadoc描述如下:这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

  • Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

  • 创建Optional类对象的方法:

    • Optional.of(T t): 创建一个Optional 实例,t必须非空;
    • Optional.empty() : 创建一个空的Optional 实例
    • Optional.ofNullable(T t):t可以为null
  • 判断Optional容器中是否包含对象:

    • boolean isPresent() : 判断是否包含对象
    • void ifPresent(Consumer<? super T> consumer) :如果有值,就执行 Consumer接口的实现代码,并且该值会作为参数传给它。
  • 获取Optional容器的对象:

    • T get(): 如果调用对象包含值,返回该值,否则抛异常
    • T orElse(T other) :如果有值则将其返回,否则返回指定的other对象。
    • T orElseGet(Supplier<? extends T> other) :如果有值则将其返回,否则返回由Supplier接口实现提供的对象。
    • T orElseThrow(Supplier<? extends X> exceptionSupplier) :如果有值则将其返回,否则抛出由Supplier接口实现提供的异常。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.bei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值