1.Lambda 表达式
lambda是一个匿名函数,简单理解为一段可以传递的代码,运用lambda表达式可以写出更简洁,更灵活的代码。
lambda表达式语法:
格式1:无参、无返回值,lambda体只需要一条语句:
Runnable r1 = ()-> System.out.println("you get it ?");格式2:一个参数;
Person<String> p1 = args -> System.out.println(args);格式3:需要两个参数,并且有返回值:
BinaryOperator<long> bo = (m,n) ->{
System.out.println("you get it ?");
return m+n;
}
BinaryOperator<long> bo = (m,n) -> m+n;格式4:参数带数据类型
BinaryOperator<long> bo = (Long m,Long n) ->{
System.out.println("you get it ?");
return m+n;
};类型推断:格式4 中参数类型是由编译器推断出来的,lambda表达式无需指定类型,Javac 根据上下文推断出参数的数据类型。
1.一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数
2.一个箭头符号:->
3.方法体,可以是表达式和代码块,方法体函数式接口里面方法的实现,如果是代码块,则必须用{}来包裹起来,且需要一个return 返回值,但有个例外,若函数式接口里面方法返回值是void,则无需{}2.函数式接口
上一题中说函数是接口,这里给出解释:只包含一个抽象方法的接口即是函数式接口。可以在任意函数式接口上使用@FunctionalInterface注解用来检查该接口是否为函数式接口。
自定义函数式接口
@FunctionalInterface
public interface myInterface<T>{
public<T> getValue(T,t)
}Java中还内置四大核心函数式接口
Consumer<T> 返回值
voidSuppliet<T> 返回值
TFuncation<T,R> 返回值
RPredicate<T> 返回值 Boolean 有关更加详细的内容可以查阅:github.com/Snailclimb/…
3.Stream Apl
Stream是Java8中一大亮点,它是处理集合的关键抽象概念,可以指定对集合进行的操作:查找,过滤和映射数据等操作,使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询,也可以使用Stream API来并行执行操作,简而言之,Stream API提供了一种高效且易于使用的处理数据的方式 。
Stream 是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。集合讲的是数据,流讲的是计算 。
Stream自己不会存储元素
Stream不会改变源对象,相反,他们会返回一个持有结果的新
StreamStream操作是延迟执行的,这意味着他们会等到需要结果的时候才执行这个概念我第一次看见于” 尚硅谷 宋老师的PPT“中。
stream中三个步骤,实例化、中间操作、终止操作
可以通过多种方式进行实例化:
通过集合可得到顺序流、并行流;可通过数组,数组提供静态方法;Stream类本身也可以实例化。stream.of()。
中间操作:筛选与切片、映射、排序
终止操作:归约、收集、匹配与查找
4.接口的默认方法与静态方法
接口实现增强:
在接口中可以添加使用 default 关键字修饰的非抽象方法,在实现接口时,默认方法在子类上可以直接使用,它的使用方式类似于抽象类中非抽象成员方法。默认方法允许我们在接口里添加新的方法,而不会破坏实现这个接口的已有类的兼容性,也就是说不会强迫实现接口的类实现默认方法。 默认方法和抽象方法的区别是抽象方法必须要被实现,默认方法不是。默认方法更像是一个替补队员,在队伍中存在着,当队伍有需要时及时补上,在平常,不要求替补队员做太多事情。默认方法没有要求一定要实现,在有需要的时候可以重写该方法。
接口里可以声明静态方法,并且可以实现。
有关更加详细的描述参照:blog.csdn.net/sun_promise…
5.Optionals
Optional是Java8提供的为了解决null安全问题的一个API,没有遇到空指针异常的程序员不是一个真的程序员。在jdk8之前,我们需要debug去定位到底是那个参数异常,出现空指针。Optional是被设计成用来代替null以表示不确定性的,换句话说,只要一段代码可能产生null,那它就可以返回Optional。而我们选择用Optional代替null的原因,是Optional提供了一个把若干依赖前一步结果的处理结合在一起的途径。