JAVA基础篇函数接口

lambda表达式
函数式编程思想,面向过程的一种思想

匿名内部类的格式
new 父类或接口(){ 重写方法 }
在整个匿名内部类中很多东西都是多余的
因为使用匿名内部类创建的是Runable实现类对象,所以不得不写了 new Runable 因为要重写run方法,所以不得不写了run方法的声明,public void run

在整个匿名内部类中最核心的是方法,方法中最核心的有前中后三点
前参数 中方法体 后返回值
也就是匿名内部类中最核心的是方法的参数,方法体,以及返回值 最好的情况是只关注这三点

如果使用lambda表达式,可以省去多余的部分,只关注核心的内容
lambda表达式是内部类的简化写法

lambda完成多线程
在这里插入图片描述

lambda表达式属于函数式编程思想
面向对象的思想 主要关注的是怎么做,关注的不是事情本身
函数式编程思想 关注的是功能本身,做什么

函数式编程思想,可推导就是可省略
匿名内部类可以省去单独创建 .java文件的过程,但是匿名内部类也有缺点,写法有些复杂,里面很多东西都是多余的,在整个匿名内部类中最核心的是方法的参数,方法体,方法返回值

如果使用lambda表达式,可以只关注最核心的这些内容
lambda表达式的标准格式 (参数类型 参数名)-------->{方法体 return 返回值}
格式解释
小括号中的参数和传统方法的参数是基本一样的,可以写多个,多个之间使用逗号隔开
-------->箭头是一个运算符,表示指向性动作 大括号中的内容和之前的传统的方法基本一样

使用lambda表达式完成多线程 lambda表达式替代的是匿名内部类,小括号表示的是run方法,因为run方法没有参数,所以什么都不用写,该方法也没有方法返回值,所以也不用写返回值,直接写方法体就可以了
在这里插入图片描述

lambda表达式可以省略面向对象中的一些条条框框,只关注最核心的东西
lambda表达式 可推导就是可省略
因为Thread构造方法需要传递一个Runable接口类型的参数,所以可以省略new Runable
因为Runable中只有一个抽象方法叫做run,所以重写的必然是run方法,所以可以省略run方法的声明部分
lambda表达式是匿名内部类的简化写法

省略规则
小括号中的参数类型可以省略,如果小括号中只有一个参数,那么可以省略小括号,如果大括号中只有一条语句,那么可以省略大括号,return,以及分号

如果要用lambda表达式 方法括号中必须是一个接口,并且该接口中只能有一个方法

使用lambda表达式的前提条件
必须要有接口(不能是抽象类)接口中必须有且仅有一个需要被重写的抽象方法
必须支持上下文推导,要能够推出lambda表达式表示的是哪个接口中内容
可以使用接口当作方法参数,然后传递lambda表达式,也可以使用接口类型的变量接受lambda表达式

匿名内部类使用lambda表达式来返回父类引用

函数式接口指的是 如果一个接口中有且仅有一个需要被重写的抽象方法,那么这个接口就是函数式接口
函数式接口可以用作lambda表达式的使用前提
有一个注解叫做@functionInterface 这个注解可以验证一个接口是否是函数式接口
如果在某个接口上面加上该注解报错,那么说明该接口不是函数式接口

函数式接口更像是一个声明,保证lambda一定可以推导出该接口的这个方法
@functionInterface 仅仅是用来验证这个接口是不是一个函数式接口,不写也没有任何关系

在JDK8的时候,提供了一个包叫做 java.utli.function 里面有大量的函数式接口
在ava.utli.function中,有一个函数式接口叫做 Consumer ,可以把它看作是一个消费者
抽象方法 void accept(T t) 消费一个数据(使用这个数据)

在java中海油一个函数式接口叫做Predicate 这个函数式接口可以判读一个数据是否符合要求,抽象方法
boolean test(T t)
Stream流 他是属于函数式编程
为什么要有这个流 因为for循环太麻烦

他是用来过滤集合与打印集合
Stream 他是集合里面的一个流,用来操作集合的数据
流式思想
如果使用这个集合的流
获取流的两种方式
通过collection 单列集合获取流
通过数组获取流

在collection中有一个方法叫做stream,可以获取集合对应的流
Stream Stream() 获取集合对应的流
Stream是一个接口,真正表示流

通过数组获流有两种方式
通过Stream的静态方法of获取流
static Stream of(T…values) 通过数组或者多个参数获取对应的Stream对象
通过数组工具类的静态方法获取stream流
static Stream stream(T[] array) 通过数组获取对应的Stream流
推荐用第一种获取流,因为第一个比较灵活,可以传数组,也可以传任意数据,因为他是一个可变参数

流的常用方法 分为两种
终结方法 返回值类型不在是Stream类型
非终结方法 返回值类型是 Stream类型

在Stream中有一个方法叫做forEach这个方法可以对流中的元素进行逐一处理
void forEach(ConSumer action) 对流中的元素进行逐一处理,参数表示的是如何处理(处理规则)
回忆 Consumer consumer 是一个函数式接口,表示消费者,里面的抽象方法acceot 可以消费使用一个数据

forEach方法参数是一个函数式接口,那么可以传递lambda表达式,这个lambda表达式真正表示的是Consumer中的抽象方法accept的内容
要在lambda表达式中定义处理的规则
在这里插入图片描述
forEach里面方法有元素,每一个元素都传给s然后s做了一个打印 该方法并不保证元素有序

filter方法用来过滤 筛选
在Stream中,还有一个方法叫做filter,可以对流中的元素进行过滤筛选
stream filter(Prdicate predicate) 对流中的元素进行过滤,会将过滤后的结果放到新的流返回,参数predicate表示过滤(是否符合要求)
回忆 Predicate Predicate 是一个函数式接口,该函数式接口用来验证一个数据是否,满足要求
抽象方法
boolean test(T t)判断参数t是否符合要求

File参数是一个Predicate 函数式接口,那么我们可以传递lambda表达式,这个lambda表达式真正表示的是Predicate中的抽象方法Test的内容,要在lambda表达式中定义判断规则,如果某个数据满足要求,那么就会留下,如果某个数据不满足要求就会过滤掉
它会从集合 或者 数组中 拿出每一个数据,来做一个比较,如果返回结果为false就会被筛选出去,数据从哪里来? 从流中来,流是从数组或者集合中来的,它会把数组放在流中,流中的数据,流动的时候 会做一些筛选 添加 等等操作
在这里插入图片描述
这个s变量 是流中传过来的,而这个方法是函数式编程,是对匿名内部类的一个缩写,它推导出了接口中的这个方法,并重写了它的方法体 他是一个非终结方法,这个流会做一些改变,每一次改变他的流都会改变 每一次它的流都是不一样的
在Stream中,有一个方法,叫做count,可以获取流中元素的个数
long count()获取流中元素的个数
他是一个终结方法,返回值是一个long 不是流
在 Stream 中有一个方法叫做limit,可以获取流中的前几个元素
Stream limit(long n)获取流中的前n个元素,并放入到一个新的流返回

在Stream中有一个方法叫做skip可以跳过流中的前几个元素,获取剩下的,把剩下的元素放到一个新的流中返回

在Stream中有一个静态方法,叫做concat,可以对两个流进行合并
static Stream concat(Stream a,Stream b) 对参数a 和 b着两个流进行合并,将合并后的结果返回。

Stream流的注意事项
Stream中的非终结方法返回值都是Stream本身类型,但是返回的结果并不是调用者自己,每次调用非终结方法产生的都是新的Stream对象
Stream流只能一次性使用,不能重复使用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值