一、函数式思想概述
面向对象思想:做一件事情,找一个能解决这个事情的对象,调用对象的方法,完成事情(重点在对象)
函数式编程思想:只要能获取到结果,怎么做的都不重要,重要在结果(不是很理解啊)
二、函数式接口
函数式接口指:有且仅有一个抽象方法的接口
函数式接口,即适用于函数式编程场景的接口。而Java中的函数式编程体现就是Lambda,所以函数式接口就是可 以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导
三、函数式接口语法
修饰符 interface 接口名称 {
public abstract 返回值类型 方法名称(可选参数信息);
// 其他非抽象方法内容
}
@FunctionalInterface注解
Java 8中专门为函数式接口引入了一个新的注解: @FunctionalInterface 。该注 解可用于一个接口的定义上:
@FunctionalInterface
public interface MyFunctionalInterface {
void myMethod();
}
注意:如果接口中只有一个接口,那么注解也可以省略
四、lambda表达式语法
2.1、初体验
public class DemoOne {
public static void main(String[] args) {
//创建一个对象
RunnableImpl run = new RunnableImpl();
new Thread(run).start();
//匿名内部类写法
//匿名内部类本质是实现了接口的无名类
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("一个线程创建啦");
}
}).start();
//lambda表达式写法
new Thread(() -> {
System.out.println("*********一个线程创建啦");
}).start();
}
}
2.2、语法
lamdba表达式的标准格式
参数
箭头
代码块
(参数类型 参数名称) —> {代码语句}
小括号内的语法与传统方法参数列表一致:无参数则留空;多个参数则用逗号分隔。
-> 是新引入的语法格式,代表指向动作
大括号内的语法与传统方法体要求基本一致
lambda表达式的简化写法
小括号内的参数类型可以省略
如果小括号内有且只有一个参数,则小括号可以省略
如果大括号内有且只有一个语句,则无论是否有返回值,可以省略大括号,return关键字以及语句分号
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
public class DemoOne {
public static void main(String[] args) {
//lambda表达式写法
new Thread(() -> {
System.out.println("*********一个线程创建啦");
}).start();
}
}
() -> {}
() - 代表run方法中的参数
{} - 代表run方法的实现
抛开实现原理不说,Java中的Lambda表达式可以被当作是匿名内部类的替代品。如果方法的参数是一个函数
式接口类型,那么就可以使用Lambda表达式进行替代。使用Lambda表达式作为方法参数,其实就是使用函数式
接口作为方法参数。