JAVA高级——lambda
-
-
- 1、是什么是函数是接口?
- 3、在哪里以及如何使用Lambda
- lambda实现:环绕执行模式
-
- 2、使用函数时接口传递行为
- 3、执行一个行为并转为lambda
-
- 2、重构使用lambda的问题
-
- 2.1 重构lambda找不到情况
- 2.2 从lambda表达式到方法引用的转换
- 3、使用lambda重构设计模式
-
lambda基础
1、是什么是函数是接口?
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
:arrow_double_up: 上图就是一个函数是接口样式;
2、lambda的特点
- 匿名————没有明确的名称:写的少想的多(就是不直观);
- 函数————它不像普通的方法有特定的类。但是方法一样,lambda有方法一切的特性;
- 传递————lambda表达式可以作为参数传递给方法或者存储在变量中;
- 简洁————无需使用匿名类,可以省掉很多模板;
下面是一个使用了lambda简化的代码模板:
public void test03(){ // 原来 Consumer<Person> consumer = new Consumer<Person>() { @Override public void accept(Person person) { System.out.println(person); } }; // now 1 Consumer<Person> consumer1 = person -> System.out.println(person); // now 2 Consumer<Person> consumer2 = System.out::println; }
3、在哪里以及如何使用Lambda
当接口是函数式接口时,可以使用;
lambda实现:环绕执行模式
这里我将述说如何自定义一个template去实现我们自己想要的函数格式;
代码样例:
// 这一行代码只能阅读固定的文件 public String BufferReadProcessor1() throws IOException { try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))){ return br.readLine(); } }
1、行为参数化
如果我一次性想读取多个行文件呢?
String result = processFile((BufferedReader br) -> br.readLine() + br.readLine());
2、使用函数时接口传递行为
package com.xiao.java_base.lambdas.demo01; import java.io.BufferedReader; import java.io.IOException; @FunctionalInterface public interface BufferReaderProcessor { String process(BufferedReader bufferedReader) throws IOException; }
现在就可以把这个接口作为新的 ProcessFile
方法参数了
3、执行一个行为并转为lambda
@Test public void test01() throws IOException { BufferReaderProcessor bufferReaderProcessor = new BufferReaderProcessor() { @Override public String process(BufferedReader bufferedRe