首页 > 编程语言 >如何用好java的lambda表达式

如何用好java的lambda表达式

时间:2023-11-15 14:33:52浏览次数:40  
标签:java 代码 System 接口 println lambda 表达式 Lambda

Lambda表达式是Java 8引入的一种新特性,它使得在Java中能够更加方便地使用函数式编程的思想。Lambda表达式可以简洁地表示一个匿名函数,可以作为参数传递给方法或者作为返回值返回。使用Lambda表达式可以使代码更加简洁、易读,并且能够更好地利用多核处理器的优势。

Lambda表达式的基本语法是: (parameter1, parameter2) -> { statement1; statement2; ... }

其中,参数列表(parameter1, parameter2)可以为空或者包含一个或多个参数,箭头符号->将参数列表和方法体分隔开来,方法体可以是一个表达式或者一个代码块。Lambda表达式的参数类型可以省略,由编译器根据上下文推断出来。

Lambda表达式主要用于函数式接口(Functional Interface),函数式接口是只包含一个抽象方法的接口。Lambda表达式可以通过函数式接口的类型来赋值给一个变量,或者作为方法的参数传递。在Java中,函数式接口可以使用@FunctionalInterface注解来显式声明,这样可以确保接口只包含一个抽象方法。

Lambda表达式的使用可以大大简化代码,使得代码更加易读、易维护。在本文中,我们将详细介绍如何使用Lambda表达式来实现各种常见的功能,包括集合操作、线程处理、事件处理等。

  1. 集合操作 Lambda表达式可以在集合类上进行各种操作,比如遍历、过滤、映射、排序等。在Java 8之前,对集合的操作通常需要使用匿名内部类来实现,代码比较冗长。而使用Lambda表达式可以使代码更加简洁。

遍历集合:

List<String> list = Arrays.asList("apple", "banana", "cherry");
list.forEach(item -> System.out.println(item));

上面的代码使用Lambda表达式遍历了一个字符串列表,输出了列表中的每个元素。forEach方法接受一个Consumer接口的实现作为参数,Lambda表达式可以直接作为参数传递给forEach方法。

过滤集合:

List<String> list = Arrays.asList("apple", "banana", "cherry");
List<String> result = list.stream()
                         .filter(item -> item.startsWith("a"))
                         .collect(Collectors.toList());
System.out.println(result); // [apple]

上面的代码使用Lambda表达式对字符串列表进行了过滤,只保留以字母"a"开头的元素。filter方法接受一个Predicate接口的实现作为参数,Lambda表达式可以直接作为参数传递给filter方法。

映射集合:

List<String> list = Arrays.asList("apple", "banana", "cherry");
List<Integer> result = list.stream()
                          .map(item -> item.length())
                          .collect(Collectors.toList());
System.out.println(result); // [5, 6, 6]

上面的代码使用Lambda表达式对字符串列表进行了映射,将每个字符串映射为它的长度。map方法接受一个Function接口的实现作为参数,Lambda表达式可以直接作为参数传递给map方法。

排序集合:

List<String> list = Arrays.asList("banana", "cherry", "apple");
list.sort((item1, item2) -> item1.compareTo(item2));
System.out.println(list); // [apple, banana, cherry]

上面的代码使用Lambda表达式对字符串列表进行了排序,按照字符串的自然顺序进行排序。sort方法接受一个Comparator接口的实现作为参数,Lambda表达式可以直接作为参数传递给sort方法。

  1. 线程处理 Lambda表达式可以很方便地用于多线程编程,可以用来简化线程的创建和管理。在Java 8之前,创建线程需要使用匿名内部类来实现Runnable接口,代码比较冗长。而使用Lambda表达式可以使代码更加简洁。

创建线程:

Thread thread = new Thread(() -> {
    System.out.println("Hello, world!");
});
thread.start();

上面的代码使用Lambda表达式创建了一个新的线程,线程的run方法中输出了"Hello, world!"。Thread类的构造方法接受一个Runnable接口的实现作为参数,Lambda表达式可以直接作为参数传递给构造方法。

使用ExecutorService:

ExecutorService executor = Executors.newFixedThreadPool(2);
executor.submit(() -> {
    System.out.println("Task 1");
});
executor.submit(() -> {
    System.out.println("Task 2");
});
executor.shutdown();

上面的代码使用Lambda表达式提交了两个任务给线程池,每个任务输出了一个字符串。ExecutorService接口的submit方法接受一个Callable或者Runnable接口的实现作为参数,Lambda表达式可以直接作为参数传递给submit方法。

  1. 事件处理 Lambda表达式可以很方便地用于事件处理,可以用来简化事件监听器的创建和管理。在Java 8之前,创建事件监听器需要使用匿名内部类来实现接口,代码比较冗长。而使用Lambda表达式可以使代码更加简洁。

使用Swing事件监听器:

JButton button = new JButton("Click me");
button.addActionListener(event -> {
    System.out.println("Button clicked");
});

上面的代码使用Lambda表达式创建了一个按钮的点击事件监听器,当按钮被点击时输出了一个字符串。addActionListener方法接受一个ActionListener接口的实现作为参数,Lambda表达式可以直接作为参数传递给addActionListener方法。

使用JavaFX事件监听器:

Button button = new Button("Click me");
button.setOnAction(event -> {
    System.out.println("Button clicked");
});

上面的代码使用Lambda表达式创建了一个按钮的点击事件监听器,当按钮被点击时输出了一个字符串。setOnAction方法接受一个EventHandler接口的实现作为参数,Lambda表达式可以直接作为参数传递给setOnAction方法。

  1. 使用Lambda表达式的注意事项 虽然Lambda表达式可以使代码更加简洁、易读,但是在使用Lambda表达式时还是需要注意一些问题,以免出现意外的错误。

变量捕获: Lambda表达式可以捕获外部的变量,但是捕获的变量必须是最终的(final)或者事实上最终的。在Lambda表达式中,对外部变量的修改会导致编译错误。

int x = 10;
Runnable r = () -> {
    // x = 20; // 编译错误
    System.out.println(x);
};

上面的代码中,Lambda表达式捕获了外部的变量x,但是对x的修改会导致编译错误。在Lambda表达式中,对外部变量的读取是允许的,但是对外部变量的修改是不允许的。

异常处理: Lambda表达式中的异常处理需要格外注意,因为Lambda表达式中的异常是隐式抛出的,不会被方法的throws声明所覆盖。在Lambda表达式中抛出的异常需要在Lambda表达式内部进行处理,否则会导致编译错误。

List<String> list = Arrays.asList("apple", "banana", "cherry");
list.forEach(item -> {
    try {
        System.out.println(item.substring(10)); // 编译错误
    } catch (StringIndexOutOfBoundsException e) {
        System.out.println("Error: " + e.getMessage());
    }
});


标签:java,代码,System,接口,println,lambda,表达式,Lambda
From: https://blog.51cto.com/u_16065115/8390791

相关文章

  • 成品直播源码,JAVA获取图片的宽、高和大小
    成品直播源码,JAVA获取图片的宽、高和大小如果是本地磁盘文件     Filefile=newFile("C:\\Users\\root\\Desktop\\test.jpg");    BufferedImagebufferedImage=ImageIO.read(newFileInputStream(file));    intheight=bufferedImage.getHei......
  • 【Windows】Java开发环境基础配置(JDK+Maven+IDEA)
    JDK下载安装包前往JDK官方网站,单击x64Installer后的下载链接,加载JDK19.0.2安装包。双击运行jdk-19_windows-x64_bin.exe。下一步,在如下步骤记录下安装路径,然后下一步直到完成。在C:\ProgramFiles\Java\jdk-19\下即可看到已安装的JDK文件。配置环境变量Windows桌面搜索......
  • Java流程控制04:if选择结构
    一、if单选择结构 二、if双选择结构 importjava.util.Scanner;publicclassifDemo02{publicstaticvoidmain(String[]args){//考试分数大于60就是及格,小于60就不及格Scannerscanner=newScanner(System.in);System.out.prin......
  • 变量提升,声明提升,函数表达式不提升。最后执行匿名函数; 用function定义的函数声明会直
    以下代码执行后,num的值是?varfoo=function(x,y){returnx-y;}functionfoo(x,y){returnx+y;}varnum=foo(1,2);A-1B3C1D2正确答案:A选A。该题考察的是JS解析顺序。根据题干:匿名函数,需要通过变量引用指向函数的运行结果。varfoo=function(x,y){//......
  • 箭头函数表达式的语法比函数表达式更简洁,并且没有自己的 this、arguments、super 或 n
    请问以下JS代码最终输出的结果和num值分别是多少?vartest=(function(){varnum=0return()=>{returnnum++}}())for(vari=0;i<20;i++){test()}console.log(test());A20、20B20、21C21、21D21、20正确答案:Btest函数的作用就是......
  • Java--day1
    一.入门1.常用快捷键ctrl+Z撤销Alt+F4关闭窗口shift+del永久删除Win+E打开我的电脑 2.基本Dos命令命令提示符ProwerShell#盘符切换 C:  #查看目录下所有内容dir#切换目录cd/df:\IDE   不同盘级之间切换 返回上一级cd.. cdabc ......
  • Linux服务器修改java项目内存大小
    找到启动脚本:找到你的Java项目的启动脚本,这通常是一个.sh(Shell脚本)文件。编辑脚本:使用文本编辑器(比如vim或nano)打开脚本文件。设置Java参数:在脚本文件中找到启动Java的命令行,并添加或修改相关的JVM参数,如下所示:bash#在启动Java的命令行中添加或修......
  • 08-Java项目企业级微服务实战《学成在线》
    黑马程序员Java项目企业级微服务实战《学成在线》,基于SpringCloud、SpringCloudAlibaba技术栈开发,项目搭建到选课支付学习全通关前后端 ......
  • [Java]format string is malformed java
    formatstringismalformedjava最近在做代码审查,发现很多在使用String.format的时候遇到了IDEA报的Formatstring'xxx'ismalformed警告。顾名思义,错误是标识字符串格式不正确,也就是说由于使用了格式不正确的字符串格式化指令导致的。这次发现的错误的使用如下:String.......
  • 如何用Java驱动万物互联,Java在物联网中能做什么?
    https://www.bilibili.com/video/BV1Kz4y1N7km/?spm_id_from=333.1007.tianma.2-3-6.click&vd_source=0d7b1712ce42c1a2fa54bb4e1d601d78      ......