Lambda简介
Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。
JDK 也提供了大量的内置函数式接口供我们使用,使得 Lambda 表达式的运用更加方便、高效 如
lambda前置条件
必须是函数式接口才可以使用lambda表达式
函数式接口特征:
接口中标注了@FunctionInterface注解
接口中只有一个抽象方法,则该接口会被编译器自动识别成函数式接口
接口中有一个抽象方法,同时包含了Object类的其他抽象方法,则该接口也会被识别成函数式接口
lambda表达式的形式
1、没有参数 () -> System.out.println("hello word");
2 只有一个参数 name -> System.out.println("hello word" + name );
3、没有参数逻辑复杂 () -> { 这里代表两行代码以上 }
4、包含两个参数的方法
BinaryOperator<Long> function = (x,y) -> x+y;
Long apply = function.apply(1l, 2l);
注:BinaryOperator 这个接口在 java.util.function;包下
5、对参数显示声明
BinaryOperator<Long> function = (Long x, Long y) -> x+y;
Long apply = function.apply(1l, 2l);
实战 实现自定义函数式接口
实现读取本地文件 自定义处理逻辑功能
/**
* 文件服务类
*/
public class FileService {
/**
* 通过url获取本地文件内容,调用函数式接口处理
*
* @param url
* @param fileConsumer
*/
public void fileHandle(String url, FileConsumer fileConsumer) throws IOException {
//创建文件读取流
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(
new FileInputStream(url)));
//定义行变量和内容sb
String line;
StringBuilder stringBuilder = new StringBuilder();
//循环读取文件内容
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line + "\n");
}
//调用函数式接口方法,将文件内容传递给lambda表达式,实现业务逻辑
fileConsumer.fileHandler(stringBuilder.toString());
}
}
//测试
public void fileHandle() throws IOException {
FileService fileService = new FileService();
fileService.fileHandle("D:\\work\\source\\学习\\996\\src\\test\\" +
"java\\com\\gc\\guoshicheng\\lambda\\file\\FileServiceTest.java",
fileContent -> {
//输出了文件的长度,和内容
System.out.println(fileContent.length());
System.out.println(fileContent);
}
);
}
常用函数接口 及使用
例如
//将 user 转换成 String
class User {
String user;
}
public String userToSting(User user, Function<User, String> function) {
return function.apply(user);
}
//测试
User user = new User();
user.user = "123";
String s = fileServiceTest.userToSting(user, user1 -> {
String str = user1.user;
return str;
});
方法引用
调用特定方法的Lambda表达式的一种快捷写法,可以让你重复使用现有的方法定义,并像lambda一样传递他们
指向静态方法的方法引用
Consumer<String> consumer1 = (String number) -> Integer.parseInt(number);
//简写为
Consumer<String> consumer2 = Integer::parseInt;
指向任意类型实例方法的方法引用
/**
* (args) -> args.instanceMethod();
* ClassName::instanceMethod;
*/
public void test2(){
Consumer<String> consumer1 = (String str) -> str.length();
//简写为
Consumer<String> consumer2 = String::length;
}
指向现有对象的实例方法的方法引用
/**
* (args) -> object.instanceMethod(args);
* object::instanceMethod;
*/
public void test3() {
StringBuilder stringBuilder = new StringBuilder();
Consumer<String> consumer1 = (String str) -> stringBuilder.append(str);
//简写为
Consumer<String> consumer2 = stringBuilder::append;
}