首页 > 编程语言 >Java 8 Lambda 表达式解析

Java 8 Lambda 表达式解析

时间:2023-09-25 12:02:50浏览次数:35  
标签:Java System 接口 println 表达式 Lambda


Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。使用 Lambda 表达式可以使代码变的更加简洁紧凑。坦白的说,初次看见Lambda表达式瞬间头就大了,为了更好的理解,我们可以把Lambda 表达式当作是一种匿名函数(对 Java 而言这并不完全正确,但现在姑且这么认为),简单地说,就是没有声明的方法,即没有访问修饰符、返回值声明和名字。


Lambda 表达式的结构


Java 中的 Lambda 表达式通常使用 (argument) -> (body) 语法书写,例如:


(arg1, arg2...) -> { body }
(type1 arg1, type2 arg2...) -> { body }


Lambda 表达式的结构说明:


  • 一个 Lambda 表达式可以有零个或多个参数
  • 参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)与(a)效果相同
  • 所有参数需包含在圆括号内,参数之间用逗号相隔。例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c)
  • 空圆括号代表参数集为空。例如:() -> 42
  • 当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a
  • Lambda 表达式的主体可包含零条或多条语句
  • 如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致
  • 如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空


列举几个 Lambda 表达式的例子:


(int a, int b) -> {  return a + b; }
() -> System.out.println("Hello World");
(String s) -> { System.out.println(s); }
() -> { return 3.1415 };


函数式接口


函数式接口是只包含一个抽象方法声明的接口。java.lang.Runnable 就是一种函数式接口,在 Runnable 接口中只声明了一个方法 void run(),我们使用匿名内部类来实例化函数式接口的对象,有了 Lambda 表达式,这一方式可以得到简化。看一下Java 8之前的runnable实现方法,需要4行代码,而使用lambda表达式只需要一行代码。



// Java 8之前:
new Thread(new Runnable() {
    @Override
    public void run() {
    System.out.println("Before Java8, too much code for too little to do");
    }
}).start();
//Java 8方式:
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();



@FunctionalInterface  是 Java 8 新加入的一种接口,用于指明该接口类型声明是根据 Java 语言规范定义的函数式接口。Java 8 还声明了一些 Lambda 表达式可以使用的函数式接口,当你注释的接口不是有效的函数式接口时,可以使用 @FunctionalInterface 解决编译层面的错误。


下面写一个自定义的函数式接口:


//定义一个函数式接口
@FunctionalInterface
public interface WorkerInterface {
   public void doSomeWork();
}
public class WorkerInterfaceTest {
public static void execute(WorkerInterface worker) {
    worker.doSomeWork();
}
public static void main(String [] args) {
    //invoke doSomeWork using Annonymous class
    execute(new WorkerInterface() {
        @Override
        public void doSomeWork() {
            System.out.println("Worker invoked using Anonymous class");
        }
    });
    //invoke doSomeWork using Lambda expression 
    execute( () -> System.out.println("Worker invoked using Lambda expression") );
}
}


使用lambda表达式对列表进行迭代


要遍历数组中的所有元素,通常使用for循环的方法,而使用 Lambda 表达式的方法不止一种。在下面的例子中,我们先是用常用的箭头语法创建 Lambda 表达式,之后,使用 Java 8 全新的双冒号(::)操作符将一个常规方法转化为 Lambda 表达式:



//Java 8之前:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
for(Integer n: list) {
   System.out.println(n);
}
//Java 8之后:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
list.forEach(n -> System.out.println(n));
// 使用Java 8的方法引用更方便,方法引用由::双冒号操作符标示,
// 看起来像C++的作用域解析运算符
list.forEach(System.out::println);


Lambda表达式对比匿名类


这个方法。




参考:


http://blog.oneap.com/apm-tech/226.html


http://www.importnew.com/16436.html



标签:Java,System,接口,println,表达式,Lambda
From: https://blog.51cto.com/u_6947107/7594391

相关文章

  • Java容器类详解
    Java的容器在Java中,我们想要保存对象可以使用很多种手段。最简单的就是数组。但是数组具有固定的尺寸,而通常来说,程序总是在运行时根据条件来创建对象,我们无法预知将要创建对象的个数以及类型,所以Java推出了容器类来解决这一问题。Java容器的基本概念Java容器类库是用来保存对象的,他......
  • 运行时数据区——Java虚拟机栈
     与程序计数器一样,Java虚拟机栈(JavaVirtualMachineStacks)也是线程私有的,它的生命周期与线程相同。Java栈以帧为单位保存线程的运行状态。每个方法在执行的时候都会创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。虚拟机只会直接对Java栈执行两种操......
  • Java底层学习
    最近在看几本Java的书,也做了很多笔记,主要是关于Java虚拟机、JavaGC、Java并发编程等方面,参考的主要几本书籍有:《深入理解Java虚拟机》——周志明《深入理解Java虚拟机第二版》——美BillVenners《Java性能调优指南》——也是老美的《Java高并发程序设计》——葛一鸣本来想自己......
  • java web应用远程debug
    javaweb应用远程debug1、在启动参数中加入下面的参数address对应的端口可以修改-Xdebug-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=155552、添加远程服务3、填充服务名(任意)、远程服务的ip和对应的端口(和上面的参数address保持一致)4、debug启动服务5......
  • 算术表达式的表示法(即求值法)
    说明算术表达式的表示法有多种,其中最常见的包括中缀表达法、前缀表达法和后缀表达法。这些表示法用于表示和求解数学表达式,它们在计算机科学和数学领域都有广泛的应用。中缀表达法、前缀表达法和后缀表达法是操作符的位置来分类的。操作符位于2个操作之间叫中缀表达法,操作符位于......
  • Java 常用类
    使用Scanner获取键盘输入hasNextXxx()是否还有下个输入项,其中Xxx可以是int、Long等代表基本数据类型的字符串。如果只是判断是否包含下一个字符串,则直接使用hasNext()nextXxx()获取下一个输入项publicclassScannerTest{publicstaticvoidmain(String[]args){......
  • spring boot错误之-Error (3, 32) java 程序包org springframework boot不存在
    问题:springboot错误之-Error(3,32)java程序包orgspringframeworkboot不存在用IDEA创建springboot,遇到上面的问题(我这里maven用的3.6.1版本)解决方法:在Settings里面,Maven路径和settings.xml要设置正确org.springframework.boot版本更改为2.1.0.RELEASE即可......
  • 9.24java wab实现创建新界面验证码
    <!DOCTYPEhtml><html><head><title>UserLogin</title><style>.container{width:300px;margin:0auto;padding:20px;border:1pxsolid#ccc;text-align:center;}.inpu......
  • Java LinkedList与ArrayList源码解析:根本区别和表面区别的详解
    在Java中,LinkedList和ArrayList是两个常见的集合类。它们都实现了List接口,但它们在实现方式上有很大的区别。本篇博客将详细解析LinkedList和ArrayList的源码,解释它们的根本区别和表面区别,并提供详细的代码解释。LinkedList与ArrayList的根本区别:数据结构:LinkedList是基于链表......
  • JAVA语法&包和访问控制
    目录前言一、Java包概述1.包的简介2.包的语法3.包的命名规则4.JDK类库里的包 5.怎么导包二、访问控制1.访问权限修饰符2.Static关键字作用前言在编写 Java一、Java包概述1.包的简介计算机中存放了若干类型的文档,为了管理方便,操作系统采用了树形结构的文件夹形式存放这些文档,并对......