Lambda表达式
函数式编程思想:
面向对象: 必须通过对象的形式来做事情.
函数式思想: 强调做什么( 注重结果 ) , 而不是怎么做.
Lambda的格式:
●一些参数 ( ) 接口中的抽象方法的参数,有就写上,没有空着
●一个箭头 - > 传递:把参数传递给{}中的方法体
●一段代码 { } 重写接口中的抽象方法的方法体
标准格式:
(参数类型 参数名称) ‐> { 代码语句 }
Lambda表达式的省略格式:
Lambda表达式的省略格式:
a.( ):( )中的参数,数据类型是可以省略的 (int a,int b)–>(a,b)
b.( ):( )中如果只有一个参数,那么类型和()都可以省略 (int a)–>a
注意:如果没有参数()不能省略
c.{ }: ()中方法体,如果只有一行代码那么{ } return ;都可以省略
注意:必须3个一起省略
代码如下:
// 匿名内部类的写法.
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("多线程任务执行!");
}).start();
// lambda表达式的写法
new Thread( () -> System.out.println("多线程任务执行!") ).start();
Lambda的前提条件:
- 使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。(函数式接口)
- 必须具有上下文推导。
也就是方法的参数或局部变量类型必须为Lambda对应的接口类型
函数式接口:有且仅有一个抽象方法的接口.
使用: 函数接口必须作为方法的参数使用
@FunctionalInterface: // 用来检测一个接口是否为函数式接口
public interface MyFunctionalInterface {
// 抽象方法
public abstract void myMethod();
}
常用的函数式接口:
1.Supplier: 生产数据
抽象方法: T get(): 获取一个泛型参数指定类型的数据.
// 创建一个方法 , Supplier接口作为方法参数类型 ,
public static Integer getMax(Supplier<Integer> s){
return s.get();
}
public static void main(String[] args) {
// 调用getString方法 , 参数是一个函数式接口 , 可以使用lambda重写get()方法.
String name = getString(() -> {
return "小美女";
});
System.out.println(name);
}
2.Consumer: 消费数据
抽象方法: void accept(T t): 消费一个指定泛型的数据.
默认方法: andThen(): 连接两个接口
public static void main(String[] args) {
// 调用方法 , 因为参数Consumer是一个函数式接口 , 所以可以使用lambda表达式.
printString((String str)->{
System.out.println(str+"被消费了!");
},"老王");
}
// 定义一个方法 , 函数接口Consumer 作为参数 .
public static void printString(Consumer<String> con , String s){
con.accept(s);
}
/*3.Function<T,R>接口:用于进行数据类型转换
抽象方法:
R apply(T t),根据类型T的参数获取类型R的结果。
*/
public class Demo01_Function {
public static void main(String[] args) {
// 调用方法 , recever方法 , 因为函数接口Function是参数 , 所以可以用lanbda表达式.
recever("100",(String s)->{
return Integer.parseInt(s);
});
}
// 创建一个方法 , Function函数接口作为参数 .
public static void recever(String s , Function<String , Integer> fun){
Integer apply = fun.apply(s);
System.out.println(apply);
}
}
4.Predicate接口:对某种类型的数据进行判断.
抽象方法: test(T t) 判断.
默认方法: and == &&
or == ||
negate == !
public class Demo01Predicate {
public static void main(String[] args) {
checkString("aadfjlfdk",(String s)->{
return s.contains("a");
});
}
// 定义一个方法 , Predicate接口作为参数
public static void checkString(String s , Predicate<String> p){
boolean test = p.test(s);
System.out.println(test);
}
}