系列文章目录
方法引用、Stream的中间操作,终结操作、静态方法
目录
一、方法引用
方法引用就是把已经存在的方法拿过来去用
条件
引用的地方必须是函数式接口
被引用的方法必须已经存在
被引用方法的形参和返回值类型需要和抽象方法保持一致
被引用的方法的功能要满足当前需求
静态方法
类名::方法名,去调用静态方法
对象引用成员方法
对象::方法名
其他类:其他类对象::方法名
本类:this::方法名
父类:super::方法名
类名引用成员方法
类名::成员方法
规则发生了改变:被引用方法的形参和抽象方法的第二个形参到最后一个形参保持一致,返回值需要保持一致。
就是说只要它们的返回值类型一样,功能可以实现,形参如果抽象方法没有第二个参数,那么被引用的方法就是无参的
引用构造方法
类名::new
引用数组构造方法
数据类型[]::new
小技巧:
1.现在有没有一个方法符合当前要求
2.如果有这个方法,这个方法是否满足引用的规则
静态 类名::方法名
成员方法
构造方法
二、Stream流
java.util.stream.Stream 接口,表示能应用在一组元素上,一次执行的操作序列,也就是可以对一组数据进行连续的多次操作。理解为一个流水线,做一堆操作,有中间方法和终结方法
获取Stream流:
单列集合:default Stream<T> stream() Collection中的默认方法
双列集合:无 无法直接使用stream流
数组:public static <T> Stream<T> stream(T[ ] array) Arrays工具类中的静态方法
一堆零散数据:public static <T> Stream<T> of(T... values) Stream接口中的静态方法
基本数据类型转Stream:IntStream LongStream DoubleStream
IntStream stream1 = IntStream.of(new int[]{1, 2, 3});
//[1,3)左闭右开
IntStream stream2 = IntStream.range(1, 3);
//[1,3],闭空间
IntStream stream3 = IntStream.rangeClosed(1, 3);
Stream转为其他类型
转为数组:toArray(可以使用方法引用)
转为集合:collect(Collectors.toList())
collect(Collectors.toCollection(ArrayList::new))//可以指定返回具体那个集合
转为字符串:collect(Collectors.joining("-")):转为字符串
Stream流常用中间方法:
filter:过滤
limit:获取前几个元素
skip:跳过前几个元素
distinct:元素去重,依赖(hahCode和equals方法)
concat:合并a和b两个流为一个流,静态方法
map:转换流中的数据类型
sorted:排序
Stream流常用终结方法:
forEach:遍历
count:统计
toArray:收集流中的数据放到数组中
collect:收集流中的数据放到集合中
IO变Stream
调用方法lines,返回一个流对象
public class BufferedReader extends Reader {//@since 1.8public Stream < String > lines () {//..}}
并行流和串行流
Stream有串行和并行两种。串行Stream上的操作是在一个线程中依次完成,而并行Stream则是在多 个线程上同时执行。
正常情况下是串行的
创建并行流的两种方式:
第一:串行流调用parallel()方法
第二:用对象调用parallelStream()方法
三、Optional
java.util.Optional<T> 类,是用来防止NullPointerException异常的辅助类型, Optional 对 象中封装的值,可以是 null ,也可以不是 null
常用方法:
of方法: 为非null的值创建一个Optional对象 *如果传入参数为null,则抛出NullPointerException
ofNullable方法 :ofNullable与of方法相似,唯一的区别是可以接受参数为null的情况
isPresent方法 :如果值存在返回true,否则返回false
get方法: 如果Optional有值则将其返回,否则抛出NoSuchElementException
ifPresent方法 :如果Optional实例有值则为其调用Consumer接口中的方法,否则不做处理
orElse方法: 如果有值则将其返回,否则返回指定的其它值
orElseGet方法: orElseGet与orElse方法类似,区别在于得到的默认值的方式不同
map方法 :如果有值,则调用mapper的函数处理并得到返回值 * 返回值并且依然Optional包裹起来,其泛型和你返回值的类型一致
flatMap方法: 如果有值,则调用mapper的函数返回Optional类型返回值,否则返回空 Optional
filter方法 :如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional