Lambda表达式简介

  • Java8 引入函数式编程风格
    • 函数式编程是一种不同的编程思想,定义函数作为一等公民赋值给变量,作为参数或者返回值进行传递
  • 可以理解为一种匿名函数的代替
  • 通过行为参数化传递代码

Lambda表达式的形式

  • (parameters) -> expression

  • (parameters) -> {statement;}

Lambda表达式的重要特征

  1. 可选的类型声明,可以不声明参数类型,编译器可以统一的识别参数值
  2. 可选的参数小括号,一个参数无需小括号,但多个参数需要小括号
  3. 可选的大括号,主体包含一个表达式则不需要大括号
  4. 可选的返回关键字,主体只有一个表达式返回值,编译器会自动返回值,大括号需要指明的返回值

具体的表现形式

  • 形式一:没有参数

    1
    () -> System.out.println("Hello World")
  • 形式二:只有一个参数

    1
    name -> System.out.println("Hello World from" + name + "!")
  • 形式三:没有参数,逻辑复杂

    1
    2
    3
    4
    () -> {
    System.out.println("Hello");
    System.out.println("World");
    }
  • 形式四:包含两个参数的方法

    1
    2
    BinaryOperator<Long> functionAdd = (x, y) -> x + y;
    Long result = functionAdd.apply(1L, 2L);
  • 形式五:对参数显示声明

    1
    2
    BinaryOperator<Long> functionAdd = (Long x, Long y) -> x + y;
    Long result = functionAdd.apply(1L, 2L);

函数式接口

  • 接口中只有一个抽象方法
  • Java8的函数式接口注解:@FunctionInterface
    • 只是作为标注,并不是强制的将函数式接口实现个一个注解,目的只是为了帮助编译器校验接口是否符合函数式接口的定义(即:是否只有一个抽象方法)
  • 函数式接口的抽象方法签名:函数描述符
    • 作为函数式接口入参的校验标准

实战:自定义函数式接口

自定义函数式接口,实现读取本地文件后自定义处理逻辑功能

定义文件处理函数式接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.function.file.service;

/**
* 文件处理函数式接口
*
* @author jinglv
* @date 2021/7/14 12:29 下午
*/
@FunctionalInterface
public interface FileConsumer {

/**
* 函数式接口抽象方法
*
* @param fileContent 文件内容字符串
*/
void fileHandler(String fileContent);
}

文件服务类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.function.file.service;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/**
* 文件服务类
*
* @author jinglv
* @date 2021/7/14 12:28 下午
*/
public class FileService {

/**
* 通过url获取本地文件内容,调用函数式接口处理
*
* @param url url
* @param fileConsumer 处理文件函数式接口
*/
public void fileHandle(String url, FileConsumer fileConsumer) throws IOException {
// 1.创建文件读取流
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(url)));
// 2.定义行变量和内容sb
String line;
StringBuilder stringBuilder = new StringBuilder();
// 3.循环都文件内容
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append("\n");
}
// 4.调用函数式接口方法,将文件内容传递给lambda表达式,实现业务逻辑
fileConsumer.fileHandler(stringBuilder.toString());
}
}

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.function.file.service;

import org.junit.jupiter.api.Test;

import java.io.IOException;

/**
* @author jinglv
* @date 2021/7/14 12:36 下午
*/
class FileServiceTest {

@Test
void testFileHandle() throws IOException {
FileService fileService = new FileService();
// 通过lambda表达式,打印文件内容
fileService.fileHandle("/Users/.../service/FileService.java", System.out::println);
}
}

url:文件路径