zoukankan      html  css  js  c++  java
  • 教你理解Lambda表达式

    Lambda表达式是Java 8 的新特性,即为匿名函数,可以表示闭包(文末有补充解释),使用它可以让代码更加简洁,但相对的代码可读性降低了……

    Lambda表达式

    1、基本语法

    expression =(variable) -> action
    //或
    expression =(variable) ->{action; }
    

    语法说明:

    • 可选类型声明:
      不需要声明参数类型,编译器可以统一识别参数值
    • 可选的参数圆括号:
      一个参数无需定义圆括号,但多个参数需要定义圆括号
    • 可选的大括号:
      如果主体包含了一个语句,就不需要使用大括号
    • 可选的返回关键字:
      如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值

    示例:

    // 1. 不需要参数,返回值为 5
    int i=()->5
    // 2. 接收一个参数(数字类型),返回其2倍的值
    int i=x ->2* x
    // 3. 接受2个参数(数字),并返回他们的差值
    int i=(x, y)-> x – y
    // 4. 接收2个int型整数,返回他们的和
    int i=(int x,int y)-> x + y
    // 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
    (String s)->System.out.print(s)
    

    2、函数式接口

    @FunctionalInterface
    
    public interface Runnable {
    
    	public abstract void run();
    
    }
    

    函数式接口:只定义一个抽象方法的接口

    Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例

    示例:

    //Lambda表达式
    Runnable r2 = ()-> System.out.println("hello");
    //匿名内部类
    Runnable r1 = new Runnable() {
    	@Override
    	public void run() {
    		System.out.println("hello");
    	}
    };
    

    Lambda表达式应用

    环绕执行模式

    利用Lambda表达式,将行为参数化,使代码更加灵活。
    现在有一个读取文件的方法:

    public static String processFile() throws IOException {
    
    try(BufferedReader br = new BufferedReader(newFileReader("data.txt"))){
           return br.readLine();
       }
    }
    

    这个方法的局限在于,只能固定读取一行,当你想读取更多行时,就需要新增方法。

    将行为参数化,使用函数式接口,利用Lambda表达式,就可以实现按需读取:

    1、定义函数式接口

    @FunctionalInterface
    
    publicinterfaceBufferedReaderProcessor{
    
       String process(BufferedReader br)throws IOException;
    
    }
    

    2、修改原方法

    public static String processFile(BufferedReaderProcessor processor) throws IOException {
    
    try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))){
    
       return processor.process(br);
    
    }
    }
    

    3、使用Lambda表达式

    /处理一行
    String result1 = processFile((BufferedReader br) -> br.readLine());
    
    //处理二行
    String result2 = processFile((BufferedReader br) -> br.readLine()+br.readLine());
    

    总结

    Lambda表达式虽然可以让代码更加简练,但是如果读代码的人功力不够的话,确实会降低代码的易读性,所以是否使用还要根据实际情况,当然我们还是非常有必要了解一Lambda表达式。

    补充

    闭包

    • 闭包就是能够读取其他函数内部变量的函数。
    • 闭包可以理解成“定义在一个函数内部的函数。
    • 在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
  • 相关阅读:
    打印沙漏
    秋季学期学习总结
    bzoj1059[ZJOI2007]矩阵游戏 二分图匹配
    bzoj1055[HAOI2008]玩具取名 区间dp
    bzoj1053[HAOI2007]反素数ant
    bzoj1049[HAOI2006]数字序列
    bzoj1046[HAOI2007]上升序列
    bzoj1044[HAOI2008]木棍分割 单调队列优化dp
    bzoj3930[CQOI2015]选数 容斥原理
    bzoj1069 [SCOI2007]最大土地面积 旋转卡壳
  • 原文地址:https://www.cnblogs.com/z-coding/p/14921215.html
Copyright © 2011-2022 走看看