Lambda表达式随笔一

在软件工程中,众所周知的问题是,不管你做什么,用户的需求肯定会发生变化;而行为参数化就是可以帮助你处理频繁变更的需求的一种的软件开发模式,而java8引入Lambda表达式就是为了更简洁,更方便的实现行为参数化

eg: (Apple a1,Apple a2) -> a1.getWeigth().compareTo(a2.getWeight);

上面展示的Lambda表达式包含三个部分:

一. 参数列表- 这里它采用了Comparator 中的compare 方法的参数,两个Apple.

二.箭头 - 箭头-> 的作用是把参数列表与Lambda主体分隔开

三.Lambda主体-上述的主体是一个表达式;如果主体带上{}的话主体表示的是一个语句(表达式和语句的区别是表达式一定会有返回值,而语句的话不一定会有返回值)

那我们在哪里以及如何使用Lambda呢?
我们可以在函数式接口上使用Lambda表达式 .
那什么是函数式接口呢? 我们先看一下Java工具包给我们提供的函数接口:

public interface Predicate
{
    boolean test (T t)
}

这个接口和我们之前定义的接口没有任何区别,非要说的话,就是这个接口只有一个抽象方法,那么一言蔽之,函数式接口就是只定义一个抽象方法的接口.

用函数式接口可以干什么呢? Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现.并把整个表达式作为函数式接口实例(即一个函数式接口的一个具体实现).其实我们也可以通过匿名内部类也可以完成同样的事情,但用Lambda表达式更为简洁方便.

//我们以Ruunable接口为例
public interface Runnable()
{
  void run()
}

//Lambda表达式
Runnable r1 = () -> System.out.println("Hello Word 1 ");

//匿名函数
Runnable r2 = new Runnable(){
    pulbic void run(){
      System.out.print("Hello Word 2")
    }
}

函数式接口的抽象方法的签名基本就是Lambda表达式的签名.这种抽象方法被称为函数描述符.Lambda表达式可以赋值给一个变量,或者是接受函数式接口作为参数的方法,我们必须保证这个Lambda表达式的函数签名必须和抽象方法的函数签名保持一致.
在Java API 中函数式接口都带有@FunctionalInterface注解,而注解表示此接口会被设计成函数式接口,如何你用这个注解来定义一个接口,而它不是一个函数式接口,那么编译器会报错.

实际应用:环绕执行模式
资源处理时一个常见的模式就是打开一个资源,做一些处理,然后再关闭资源.这个设置和清理的阶段总是很相似,并且会围绕着执行处理的那些重要的代码.这就是所谓的环绕执行模式

//初始化/准备代码
.........
//任务
public static String processFile() throw IOException {
BufferedReader br = new BufferedReader(newFileReader("data.txt"));
    return br.readLine();
}
// 清理/结束代码

从这段代码我们知道主要任务是读取data.txt文件的一行.如果我们想读取两行呢? 我们需要改变的只是读取任务代码.而其他的代码是不用改变的.
我们来想一想我们要改变的是processFile 方法体的行为就可以实现我们的要求.如果我将行为以参数的形式传给方法的话,你我们完全不用改变整个结构体,我们重点就只是关注行为的变化,这就是我们上面提到的应对变化时行为参数化.现在让我们通过函数式接口来传递行为

@FunctionalInterface
public interface BufferedReaderProcessor{
  String process(BufferedReader b) throw IOException
}

pubilc static String processFile(BufferedReaderProcessor b){
   BufferedReader br = new BufferedReader(newFileReader("data.txt"));
   return b.process(br)
}

@Test 
public static String processFile (( BufferedReader br) ->
{return br.readLine() + br.readLine()}){
    .....
}

你可能感兴趣的:(Lambda表达式随笔一)