## Lambda 表达式-函数式编程 [TOC] ### 概述 + 只有是函数式的接口才可以使用lambda表达式 + 接口中有且只有一个抽象方法的接口称为函数式接口 + @FunctionalInterface 注解强制检测是否为函数式接口 ### 用法 + 无参数,无返回值:()-> 具体实现 + 有一个参数,无返回值:(x)-> 具体实现 + 若只有一个参数,小括号可以省略不写:x -> 具体实现 + 若有多个参数,多条语句,加个大括号就行了:(x,y)-> { 具体实现 } + 若 lambda 中只有一条语句,return 和大括号都可以省略不写,如`Comparatorcom = (x,y) -> Integer.compare(x,y)` ### 四大内置函数式接口 | 接口 | 语法 | | :---------------------------: | :---------------: | | Consumer<T> 消费型接口 | void accept(T t) | | Supplier<T> 供给型接口 | T get() | | Function 函数型接口 | R apply(T t) | | Predicate<T> 断言型接口 | boolean test(T t) | ### 案例演示 #### Consumer + ##### 示例 ```java String name = "大山"; private void consumer(Consumer consumer){ consumer.accept(name); } @Test public void test1(){ consumer((name)-> System.out.println("我的名字:"+name)); // 若只有一个参数,小括号可以省略不写:x -> 具体实现 consumer(name-> System.out.println("他的名字:"+name)); } ``` + ##### 输出内容 ``` 我的名字:大山 他的名字:大山 ``` #### Supplier + ##### 示例 ```java private void supplier(Supplier supplier){ System.out.println("今日生产数量:"+supplier.get()); } @Test public void test2(){ supplier(()-> {return 123;}); // 若 lambda 中只有一条语句,return 和大括号都可以省略不写,如`Comparatorcom = (x,y) -> Integer.compare(x,y)` supplier(()-> 150); } ``` + ##### 输出内容 ```sh 今日生产数量:123 今日生产数量:150 ``` #### Function + ##### 示例 ```java private void function(String num,Function function){ System.out.println("生产数量:"+(function.apply(num)+100)); } @Test public void test3(){ function("200",num-> Integer.parseInt(num)); } ``` + ##### 输出内容 ``` 生产数量:300 生产数量:120 ``` #### Predicate + ##### 示例 ```java private void predicate(Integer age,Predicate predicate){ System.out.println("我今年成年了吗:"+predicate.test(age)); } @Test public void test4(){ predicate(15,age->age>=18); predicate(23,age->age>=18); } ``` + ##### 输出内容 ``` 我今年成年了吗:false 我今年成年了吗:true ```