java8新特性学习之函数式接口与Stream流思想
一、使用匿名内部类的匿名对象创建线程和Lambda表达式写法
Lambda表达式写法不用去定义一个Runable接口的实现类;
二、方法入参是一个接口或者接口的实现类
三、对某个类的一些对象实例进行排序
其中,数组创建时候使用的是静态初始化,里面存放的对象是匿名对象;
Lambda表达式写法:
四、计算两数和,方法的入参是一个接口
五、Lambda表达式写法上下文可推导可省略
入参列表有且只有一个;参数列表的括号可以省略(参数列表中参数的类型所有情况下都可以省略)
方法体只有一行代码:方法体花括号、一行代码后面的结束分号和return,这三必须一起省略;
一、函数式接口
有且仅有一个抽象方法;
2、匿名内部类也会产生class文件,类加载时候就要消耗jvm资源,lambda表达式不会,所以效率高;
3、性能浪费的日志案例
使用lambda表达式优化
方法的参数列表第二个参数是一个函数式接口,只含有一个抽象方法;
4、runnable接口实例:函数式接口,只有一个run方法;
有且仅有一个参数时候,参数括号可以省略;方法体只有一行代码,花括号和分号和return要一起省略;
5、函数式接口作为方法的返回值
排序,comparator接口,函数式接口,只含有一个compare抽象方法;后面 - 前面,则是降序;
调用:
Arrarys是数组的工具类,
降序,大的在前面;
6、util.function包下的常用函数式接口:supplier接口
使用supplier求数组中最大值
7、Comsumer接口
字符串缓冲区可以反转字符串内容:;
Comsumer函数式接口的默认方法 default andThen():
8、Comsumer消费数据接口练习:
写处理方法供调用:
调用方法:传入的是lambda表达式,代替接口的匿名对象或者实现类的方式,方法体中就是重写函数式接口那个唯一的抽象方法的方法体:
9、Predicate接口的唯一抽象方法Test方法,boolean判断:
值是一个boolean值;
9.2、Predicate接口的默认方法:and用法:
9.3、默认方法or方法;
9.4、Predicate函数式接口取反用法:唯一抽象方法是negate():
10、Function函数式接口,转换数据类型:
定义后的调用:
11、Function接口综合用法:
Stream流思想:
一、IO流用于读写;Stream流用于处理数组和集合数据;
1、传统集合遍历:
2、使用Stream流的方式过滤:
其中,链式编程(返回值就是对象自己)中,filter使用的是Predicate函数式接口,它的唯一抽象方法是Test()布尔判断:
遍历方法forEach()使用的是数据消费Comsumer函数式接口唯一抽象方法是accept()方法,方法体中(lambda表达式)就是对入参数据经行处理使用就行::
2、Stream流的思想: 是个生产线,只处理获取的数据源数据,不存储数据:
其中,map步骤,映射可以改变集合元素的数据类型;
二、获取集合的两种方法
1、Collection集合的List和Set单列集合:
其中,String的底层就是一个字节数组;
2、Map双列集合集合:
3、Stream类的静态方法of()获取:
三、Stream流的常用方法:
其中,前面延迟方法是处理集合数据,最后终结方法是真正的改变数据元素;
1、终结方法for each
2、延迟方法 filter
3、Stream是管道流,只能被消费(使用)一次;
异常:
4、延迟方法map方法,使用的是函数式接口function接口,的apply唯一抽象方法:
function接口的唯一抽象方法apply:
5、终结方法count()
6、延迟方法limit:
7、延迟方法skip:
8、Stream类的静态方法concat() , 合并流
9、集合元素处理实例
9.1传统集合方式处理:
从两个集合中选几个String类型的name 满足条件的元素到新集合中并创建person对象:
其中,addAll是把一个集合的元素都添加到当前集合对象中;
9.2Stream流的方式
其中,Stream类静态方法concat(stream1, stream2),map方法映射,将集合中元素数据类型转换,String应用类型转换成Person引用类型,使用forEach() 遍历处理终结;