Java8中的一些概念和新特性
说到Java8都会说到函数式编程或者都说提到lamdba表达式,先具体讲个个概念解释一遍
函数式编程
什么是函数式编程,
为什么要使用函数编程说到函数式编程一般都会提出上面两个疑问
什么是函数式编程,过去我们的编程习惯,称为指令式编程,命令式编程,或是声明式编程, 这种编程的风格非常适合经典的面向对象编程,专注于如何实现,如下面代码,从列表中找到最昂贵的事务
if (mostExpensive==null){
throw new IllegalAccessException("Empty list of transactions");
}
for (Transaction t:transactions.subList(1,transactions.size())){
if (t.getValue()>mostExpensive.getValue()){
mostExpensive=t;
}
}```
而函数式编程的特点在于 更加关注要做什么,最终实现的细节 留给函数库,这种思想称之为内部迭代,它的特点在于让人读起来像是问题的陈述
``` Optional<Transaction> mostExpensive = transactions.stream().max(Comparator.comparing(Transaction::getValue));```
函数式编程的定义是什么:**简单的说是一种使用函数来进行编程的方式**,复杂的定义:**是将代码传递给方法(同时也能够返回代码并将其包含在数据结构中),还能让我们能够使用一整套新技巧,称为函数式编程**
为什么要使用函数式编程 他的好处是什么
-------------------
1. 代码量少很多
2. 易于阅读
3. 无副作用:副作用指的是:函数在调:用过程中,除了给出了返回值外,还修改了函数外部的状态,函数的副用作应该被尽量避免,这种函数调用的副作用,在函数式编程里,需要进行有效的限制。
4. 尾递归优化:过去递归的最大问题在于它总是使用栈空间,现在我们不需要再不同的栈帧上保持每次递归计算的中间数值,编译器能够自行决定服用某一个栈帧进行计算。
5. 易于并行,内部的迭代让我们可以并行处理一个流,而无需再代码中显示使用和协调不同的线程。
6. 避免了空指针,通过optional 来取代null 的时候发生的情况。
同时java8提供了新的特性和API供我们使用
1. 对于过去Date和Calendar来处理时间非常非常的不便,在1.8中引入了LocalDate和LocalTime instant Duration等来方便解决时间日期等问题
2. 提供行为的多继承
```public interface Sized{
int size();
default boolean isEmpty(){
return size()==0;
}}
如果这个接口有多个实现类 突然接口多一个方法 实现类要必须实现这个方法 会非常不便,通过defalut 让改进API对象有多实现 所有就相应的出现了多继承行为的情况```
Java8的名词
==
1. 行为参数化:面向接口编程的概念相同(个人理解),将相同的行为,提取出来称为一个接口。 2. 函数式接口:只定义一个抽象方法的接口称为函数式接口如
` @FunctionalInterfacepublic interface Runnable { public abstract void run();}FunctionalInterface 这个注解是来让编译器检查当前是否是一个函数式接口`
函数描述符:函数式接口的抽象方法的基本签名基本上就是lambda表达式的签名。我们将这种抽象方法称为函数描述符如`(Apple,Apple)->int ` 代表两个Apple作为参数传递进来返回一个int的函数
3. 流:定义:从支持数据处理操作的源生成的元素序列 3. 元素序列:集合和流类似,可以访问特定元素类型的一组值。但是集合是数据结构,主要的目的是一特定的时间/空间复杂度存储和访问元素。但是流的目的在于计算。
4. 源:流会使用一个提供数据的源,
5. 数据处理操作,常见操作如filter,map reduce find match sort等
6. 流水线:很多 流操作本身会返回一个流,多个操作就可以连接起来
7. 内部迭代, 和显示的迭代不同,流的迭代是在背后进行的。
3. 收集器:也可以理解为终端操作,它接受参数是流中的元素累计到汇总结果的各种方式。
**在Android Studio 使用lamdba**
```在最外层的 build.gradle dependencies
{
classpath 'me.tatarka:gradle-retrolambda:3.2.5'
}
在需要的modelu中build.gradle 添加 apply plugin: 'me.tatarka.retrolambda'
在Android 的标签下 加入compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
就可以在Android Studio 中使用lamdba了