• 教你理解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表达式。

    补充

    闭包

    • 闭包就是能够读取其他函数内部变量的函数。
    • 闭包可以理解成“定义在一个函数内部的函数。
    • 在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
  • 相关阅读:
    PHP的几个常用加密函数
    sha1() 函数
    微信支付接口文档
    最强PostMan使用教程(1)
    用 Graphviz画神经网络图
    绘图工具graphviz学习使用
    maven添加oracle jdbc依赖
    httrack,webdup,WinHTTrack,WebZip
    过滤ASCII码中的不可见字符, ASCII三部分, 各控制字符详解, 去^@,^M
    报LinkageError的原因
  • 原文地址:https://www.cnblogs.com/z-coding/p/14921215.html
Copyright © 2020-2023  润新知