Java8学习总结

Java8引入的特性:
Stream API
向方法传递代码的技巧,即行为参数化
接口中除了可以指定抽象方法之外,还可以指定default默认方法以及静态方法
java8引入的新特性其实是简化了使用,也适应新的计算机体系结构而演变的

备注:多核Cpu并行处理,实际上是要遵循缓存一致性通信协议的,而缓存一致性协议往往都是比较慢的。这是因为每个cpu都有自己的独立的高速缓存,多核运行需要将这些高速缓存做同步。

引入了流操作,相比较Synchronized其在多核CPU上所执行需要的成本也比你想象的更低

Java是运行在虚拟机上面,除了java语言运行在虚拟机上面,还有Groovy,Scala也都是运行在虚拟机JVM上面的

流处理:
流:由一系列的数据项组成,程序从输入流中一个一个读取数据项,然后一个一个地写入输出流。一个程序的输入流很可能是另一个程序的输出流。
流操作实际上是可以提高并行的

Function接口

java8:
方法中需要传递值(包括引用),直接传递值得类型称之为是一等公民,java8就是想让方法本身由二等公民变成是一等公民,就是让方法作为值来进行传递
让方法变成值也成为了其他java8功能(Stream)的基础

如果lambda表达式的逻辑很长,那么还是应该定义出来这个方法,然后再使用方法引用,其实这样代码看起来会比较整洁一点。

如果lambda表达式的逻辑很简单,那么实际上你不需要定义一个类,然后指定一个方法,可以直接使用lambda表达式来替换

java8有一套新的类集合API Stream. 类似于fitfer操作。比如map reduce等操作

将方法和Lambda作为一等值
Stream API就用到了这个思想

先引出行为参数化:
然后就是匿名内部类实际上也是可以实现行为参数化,但是代码比较啰嗦,lambda表达式可以很简洁的表示一个行为或者参数。

lambda表达式具有匿名功能,没有声明方法的名称,之所以不需要声明方法的名称就是因为所谓的函数式接口 只能是有一个抽象方法 也就相当于默认采用这个方法。

lambda表达式可以作为一个参数传递给一个方法。

使用Lambda表达式以及方法引用对自己的写的demo进行改进

Comparable c = laombada表达式
Function f = lambda表达式

lambda表达式格式
参数->expression/{statement;}

lambda表达式在哪里使用
用在函数式接口

函数式接口:
该接口中定义了一个抽象接口,但是可以有很多个静态方法以及默认方法
lamabda表达式可以作为函数式接口具体实现的实例。用匿名内部类也可以达到同样的目的,只不过会比较笨拙。

这里需要思考一下 为什么lambada表达式可以作为函数式接口的一个实现,

lambda表达式是如何做到类型检查的。编译器会根据上下文进行类型推断。

自己学习一个回调函数以及java当中的事件处理以及Spring中的事件处理。

注意的一点其实就是你使用的lambda表达式其实要符合函数式接口抽象方法的定义。比如抽象方法的返回值是boolean类型的,参数列表分别是int a,boolean b

那么函数表达式写成这样肯定不对

()—> return “123”+7;

@FunctionInterface :函数式接口的注解

如果一个接口 只有一个抽象方法 并且没有标注该注解 那么其实也是函数式接口

如果一个接口中定义了多个抽象方法 标注了这个注解 那么会编译报错

如果使用lambda表达式以及行为参数化让代码变得更加灵活。

如何去使用函数式接口
1.首先需要定义一个函数式接口 java8提供了一些函数式接口
2.你需要去书写一个lambda表达式去传递你的行为。
3.你需要有一个方法来处理这个行为
比如
public static String fun(函数式接口Function f){
apply(lambda表达式)//相当于是处理你的行为
}

这样通过你传递过来的不同行为lambada表达式 就可以进行执行

函数式接口的抽象方法的签名称为是函数描述符,函数式接口的方法签名实际上就代表了lambda表达式的签名。

java8也提供了一套描述常见函数描述符的函数式接口。
比如Comparaabl额 Runnbale Callable接口

具体添加的函数式接口详细参考java.util.function

Boolean Predicate:接受的类型是T类型,但是返回值是Boolean
里面有一个是test(T)抽象方法

void Consumer:里面有一个accpet(T)的抽象方法。可以对你传入的值进行操作 但是不会做值得返回,这需要尊韩函数描述符。

R Function(T t,R r)//接受的其实是一个T类型,但是返回的其实是一个R类型。
T Supplier()、、
T BiFunction<U,R>

Compartor<T,T>

在使用函数式接口的过程中,如果遇到了异常该怎么处理(函数式接口是不允许抛出异常的) 这是可以做显示的捕捉。

原始类型装箱称为引用类型,实际上是需要付出代价的,

IntPredicate a = 函数表达式 ;这个实际上就不会完成装箱的操作
Predicate a = 函数表达式;实际上是会完成装箱的操作。

一般地 针对专门的输入参数类型的函数式接口的名称都要加上对应的原始类型前缀,比如DoublePredicate IntConsumer IntFunction

方法引用:可以让你重复使用现有的方法定义,并且像lambda一样传递他们。相比较Lambda表达式,他们更加可读,并且更加自然

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值