目录:
1. 函数式编程介绍
2. Lambda表达式
3. 函数式接口
一. 函数式编程介绍
面向对象编程的思想是对数据进行抽象,而面向函数编程的思想是对行为方法进行抽象。函数式编程的好处主要有:
1.函数式编程可以减少业务逻辑和代码的分歧。他允许我们再更高层次更自然的描述业务逻辑。
2.许多样板可以被移除,这会让代码更清晰和简洁。
3.高阶函数允许我们:发送方法到其他方法中;在其他方法中创建方法;从其他方法中返回方法。
4.ldambda表达式,实现惰性求职,当发送lambda表达式作为一个方法的参数,java编译器会在lambda表达式在方法中被调用时才计算他的值。
二. Lambda表达式
Lambda表达式的实现是为了支持函数式编程,而为了支持lambda表达式,才有了函数式接口。 另外,在面对大型数据集合时,为了能够更加高效的开发,编写的代码更加易于维护,更加容易运行在多核CPU上,java在语言层面增加了Lambda表达式。
Lambda表达式使用: 例如运行一个线程一般这样写:
new Thread(new Runnable()) {
@Override
public void run() {
System.out.println("Testing!");
}
}).start();
使用lambda代码非常简洁:
new Thread(
() -> System.out.println("Testing!");
);
三. 函数式接口
java8中接口变化:
1.静态方法:为了编写类库,对某些行为进行抽象。
2.默认方法:为了实现二进制的向后兼容性,引入了带有方法体、被default修饰的方法--默认方法。其主要思想就是如果子类中没有实现,那么采用父类提供的默认实现。
函数式接口,与其他接口的区别:
1. 函数式接口中只有一个抽象方法。
2. 可以有从Object继承过来的抽象方法,因为所有类的最终父类都是Object。
3. 接口中唯一抽象方法的命名不重要,因为函数式接口就是对某一行为进行抽象,主要目的是支持lambda表达式。
Java8之前已经存在的函数式接口有:
java.lang.Runnable
java.util.concurrent.Callable
java.security.PrivilegedAction
java.util.Comparator
java.io.FileFilter
java.nio.file.PathMatcher
java.lang.reflect.InvocationHandler
java.beans.PropertyChangeListener
java.awt.event.ActionListener
javax.swing.event.ChangeListener
另外,Java8还提供了@FunctionalInterface注解来帮助我们标识函数式接口。另外需要注意的是函数式接口的目的是对某一个行为进行封装,某些接口可能只是巧合符合函数式接口的定义。
如图1-3所示,为java8的Function包的结构(即新引入的函数式接口),图中绿色表示主要引入的新接口,其他接口基本上都是为了支持基本类型而添加的接口,方法的具体作用图中有具体说明。
实例: 自定义函数接口支持lambda表达式
public class LambdaMain {
public static void main(String[] args) {
Action action = System.out :: println;
action.execute("Hello World!");
test(System.out :: println, "Hello world!");
test(action, "Hello world!");
}
static void test(Action action, String str) {
action.execute(str);
}
}
@FunctionalInterface
interface Action<T> {
public void execute(T t);
}