Lambda表达式(语法+函数式接口+使用+变量捕获)

news2025/1/11 17:59:03

文章目录

  • Lambda表达式
    • 一、语法
        • 1.(parameters)
        • 2. ->
        • 3.方法体
        • 4.函数式接口
    • 二、Lambda的使用
    • 三、变量捕获
    • 四、Lambda在集合中的应用


Lambda表达式

  • 允许通过Lambda表达式来代替功能接口
  • 提供了一个正常的参数列表和使用这些参数的主体
  • 也叫闭包

一、语法

(parameters) -> expression(parameters) ->{ statements; }

1.(parameters)

1.这个参数的函数式接口中的参数

2.参数类型可以声明,也可以省略,让JVM来推断

3.只有一个推断类型时,可以省略掉( )

2. ->
  • 指向符:“被用于”
3.方法体

1.可以是表达式,也可以是代码块。

2.是函数式接口里方法的实现

3.可以返回一个值或不返回

4.函数式接口
  • 只有一个抽象方法的接口,叫做函数式接口

  • 接口上声明 @FunctionalInterface 注解后,如果这个接口存在两个抽象方法,会报错

@FunctionalInterface
interface NoParameterNoReturn {
    //函数式接口,只有一个抽象方法
    void test();
    default void func(){
        System.out.println("func");
    }

}
  • 由于函数式接口只允许有一个抽象方法,因此其他非抽象方法(如equals、hashCode、toString等)都会被继承自Object类的默认实现覆盖。
  • 在Java中,Object类中的equals方法是用来比较两个对象的内容是否相等,但默认实现是比较对象的引用是否相等。如果我们希望在函数式接口中重新定义equals方法,以实现内容相等的比较逻辑,就需要将equals方法声明为抽象方法,让具体实现类去覆盖默认的equals方法,从而实现我们所需的比较逻辑。

二、Lambda的使用

  • 要调用的函数式接口
//无返回值无参数
@FunctionalInterface
interface NoParameterNoReturn {
void test();
}
//无返回值一个参数
@FunctionalInterface
interface OneParameterNoReturn {
void test(int a);
}
//无返回值多个参数
@FunctionalInterface
interface MoreParameterNoReturn {
void test(int a,int b);
}
//有返回值无参数
@FunctionalInterface
interface NoParameterReturn {
int test();
}
//有返回值一个参数
@FunctionalInterface
interface OneParameterReturn {
int test(int a);
}
//有返回值多参数
@FunctionalInterface
interface MoreParameterReturn {
int test(int a,int b);
}
  • 如果不用Lambda表达式,则要用过匿名内部类来实现接口
        NoParameterNoReturn noParameterNoReturn = new NoParameterNoReturn() {
            //匿名内部列,实现了这个接口,重写了这个接口当中的方法
            @Override
            public void test() {
                System.out.println("重写了test方法");
            }
        };//注意这里是分号

        PriorityQueue<Integer>priorityQueue = new PriorityQueue<>(new Comparator<Integer>() {
            //传进的是一个匿名对象
            //这个类实现了这个接口并且重写了compare方法
            @Override
            public int compare(Integer o1, Integer o2) {
                return 0;
            }
        });
  • 而采用Lambda表达式,可以进行缩写
 NoParameterNoReturn noParameterNoReturn = ()-> System.out.println("重写了test方法");
 noParameterNoReturn.test();//重写了test方法

PriorityQueue<Integer>minHeap = new PriorityQueue<>((o1,o2)->{return o1.compareTo(o2);});

  • 有无参数和有无返回值的各种接口实现Lambda写法
        NoParameterNoReturn noParameterNoReturn = () -> System.out.println("重写了test方法");
        noParameterNoReturn.test();//重写了test方法
        OneParameterNoReturn oneParameterNoReturn = (a) -> System.out.println("oneParameterNoReturn" + a);
        oneParameterNoReturn.test(10);//oneParameterNoReturn10
        MoreParameterNoReturn moreParameterNoReturn = (a, b) -> System.out.println(a + b + "moreParameterNoReturn");
        moreParameterNoReturn.test(1,3);
//有返回值
//          NoParameterReturn noParameterReturn = ()->{return 10};
         NoParameterReturn noParameterReturn = ()-> 10;
        System.out.println(noParameterReturn.test());//10
        OneParameterReturn oneParameterReturn = a -> a+1;
        System.out.println(oneParameterReturn.test(2));//3

        MoreParameterReturn moreParameterReturn = (a,b)->a+b;
        System.out.println(moreParameterReturn.test(2, 3));//5


  • Lambda表达式可读性差
  • 可以省略掉参数类型
  • 只有一个参数可以省略掉()
  • 只有一条语句可以省略掉 { }
  • 只有一条语句并且是return语句,可以省略掉return

三、变量捕获

匿名内部类的变量捕获

        int a = 10;
        //匿名内部类
        NoParameterNoReturn noParameterNoReturn = new NoParameterNoReturn() {
            //匿名内部列,实现了这个接口,重写了这个接口当中的方法
            @Override
            public void test() {
                //a = 99;//会发生报错
                System.out.println("重写了test方法");
            }
        };//注意这里是分号
  • 在匿名内部类当中,如果要使用外部的变量需要满足一下条件
  • 要么是常量、要么是未经修改的
  • 总之,这个变量是不能修改的

在Lambda表达式中同理

        int size = 10;
        size = 100;
        NoParameterNoReturn noParameterNoReturn = () -> System.out.println("重写了test方法"+size);
																	//报错,不能对变量进行修改

四、Lambda在集合中的应用

    public static void main(String[] args) {
        List<String>list = new ArrayList<>();
        list.add("hello");
        list.add("world");
        list.add("!!!");

        list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);

            }
        });
        
        
        list.forEach(s -> System.out.println(s));
        //简化
        /*        list.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });*/
        list.sort((o1, o2) -> o1.compareTo(o2));
        list.forEach(s -> System.out.println(s));
    
    }
  • forEach方法,继承自Consumer,是一个函数式接口

    在这里插入图片描述

        Map<String,Integer> map = new HashMap<>();
        map.put("hello",1);
        map.put("world",2);
        map.put("!!!",3);
/*        map.forEach(new BiConsumer<String, Integer>() {
            @Override
            public void accept(String s, Integer integer) {
                System.out.println("key =  "+s+" val =  "+integer);
            }
        });*/
        map.forEach((key,val)-> System.out.println("key =  "+key+" val =  "+val));

点击移步博客主页,欢迎光临~

偷cyk的图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1558912.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django框架之DRF(武沛齐全)

一、FBV和CBV FBV&#xff0c;function base views&#xff0c;其实就是编写函数来处理业务请求。 from django.contrib import admin from django.urls import path from app01 import views urlpatterns [path(users/, views.users), ] from django.http import JsonResp…

模拟游戏《幸福工厂》好玩吗?《幸福工厂》怎么在mac电脑上打开?

关于《幸福工厂》这款游戏是否好玩&#xff0c;普遍的玩家反馈和评价表明&#xff0c;《幸福工厂》&#xff08;Satisfactory&#xff09;因其深度的工厂建造模拟、自由度极高的探索以及精美的图形表现而受到许多玩家的喜爱。它允许玩家在一个开放的世界中规划并建立复杂的生产…

unity 打包安卓错误汇集

Failed to find target with hash string "android-34’ in: D:Pr 他说找不到sdk34level的我用as打开后卸载又重装&#xff0c;最后解决了 我放到Plugins/Android/下面的Java代码没有被编译 这个不知道为什么。我故意把代码写的有问题&#xff0c;会报错那种&#xff…

项目安全性与权限管理实践与探讨

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一. 身份验证和授权 二. 输入验证和过滤 2.1. 添加O…

Linux USB驱动(二)

1. Linux USB驱动软件框架 应用程序有两种访问硬件的途径&#xff1a;通过设备驱动程序来访问和跳过设备驱动程序&#xff08;直接使用host驱动程序&#xff09;来访问。 当直接使用Host驱动程序时&#xff0c;可以调用libusb库中已经封装好的函数接口。 2. USB电气信号 一个…

Salesforce技术移民主要国家薪资 - 汇总篇

各位Salesforce的宝们&#xff0c;汇总版的Salesforce技术移民主要国家薪资表格及图示给到大家。 主要针对以下四个岗位&#xff1a;Salesforce管理员、Salesforce项目经理、Salesforce业务分析师、Salesforce架构师&#xff1b; 为方便各位看官&#xff0c;分为了欧元区与美元…

Figma使用问题(更新自己遇到的问题)

文章目录 前言一、如何安装插件&#xff1f;方法1&#xff1a;Figma Community / Figma中文社区方法2&#xff1a;菜单栏 二、图片倾斜插件使用1.Angle Mockups前提&#xff1a;执行过程&#xff1a; 三.中文字体插件&#xff08;宋体等&#xff09;Chinese Font Picker前提&am…

基于深度学习的图书管理推荐系统(python版)

基于深度学习的图书管理推荐系统 1、效果图 1/1 [] - 0s 270ms/step [13 11 4 19 16 18 8 6 9 0] [0.1780757 0.17474999 0.17390694 0.17207369 0.17157653 0.168248440.1668652 0.16665359 0.16656876 0.16519257] keras_recommended_book_ids深度学习推荐列表 [9137…

Redis 事务 与 管道

redis事务 谈到事务大家可能就会想起mysql中的事务 注意这里的事务不是指的是事务的四大特性acid 持久性 原子性 隔离性 一致性 事务的概念就是 一组命令,串行化执行而不被打断 这里redis的事务和mysql的事务就不太一样 传统关系型数据库的事务主要强调的是一个没有执行完成就…

python3——基础概要

基础 数据结构 Python 3.x中有6种标准的对象类型&#xff1a; Number&#xff08;数字&#xff09;、String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Tuple&#xff08;元组&#xff09;、Sets&#xff08;集合&#xff09;、Dictionary&#xff08…

B+Tree讲解

B-/B树看 MySQL索引结构 B-树 B-树,这里的 B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树.它类似普通的平衡二叉树&#xff0c;不同的一点是B-树允许每个节点有更多的子节点。下图是 B-树的简化图. B-树有如下特点: 所有键值分布在整颗树中&#xff1b; 任何一个…

【MySQL】内外连接——内连接、外连接、左外连接、右外连接、内外连接的区别、左外连接和右外连接的区别

文章目录 MySQLMySQL表的内连接和外连接1. 内连接2. 外连接2.1 左外连接2.2 右外连接 3. 内外连接的区别4. 左外连接和右外连接的区别 MySQL MySQL表的内连接和外连接 MySQL 中的内连接&#xff08;INNER JOIN&#xff09;和外连接&#xff08;包括左外连接 LEFT JOIN 和右外连…

数据分析之Tebleau 简介、安装及数据导入

Tebleau简介 Tebleau基于斯坦福大学突破性交互式技术 可以将结构化数据快速生成图表、坐标图、仪表盘与报告 将维度拖放到画布等地方是他的主要操作方式 例&#xff1a;Tebleau是手机相机 &#xff08;相对来说更简单&#xff09; POWER BI是单反相机 Tebleau各类产品 Teblea…

GPT提示词分享 —— 智能域名生成器

提示词&#x1f447; 我希望你能充当一个聪明的域名生成器。我将告诉你我的公司或想法是什么&#xff0c;你将根据我的提示回复我一份域名备选清单。你只需回复域名列表&#xff0c;而不是其他。域名应该是最多 7-8 个字母&#xff0c;应该简短但独特&#xff0c;可以是朗朗上口…

ubuntu16.04 不支持 gcc-11,g++11

总结 ubuntu16.04 不支持 gcc-11&#xff0c;需要升级 18.04 或更高的版本。 背景 最近需要在我的 ubuntu16.04 电脑上安装 gcc-11&#xff0c;g-11&#xff0c;使用更高的版本来编译代码。根据网上查到的方式是添加以下的源并进行安装 sudo add-apt-repository ppa:ubuntu…

第十三届蓝桥杯JavaA组省赛真题 - 求和

解题思路&#xff1a; 这&#xff0c;真的是&#xff0c;省赛真题吗... public class Main {public static void main(String[] args) {long res 0;for (int i 1; i < 20230408; i) {res i;}System.out.print(res);} }

1.5编写一个程序,输入梯形的上底,下底和高,输出梯形的面积。

1、编写一个程序,输入梯形的上底,下底和高,输出梯形的面积。 package com.kangning.web.controller.system;import java.util.Scanner;/*** 编写一个程序,输入梯形的上底,下底和高,输出梯形的面积。*/ public class CountArea {public static void main(String[] args) …

Available platform plugins are: linuxfb, minimal, offscreen, vnc.

说明&#xff1a; buildroots根文件中已经移植好了QT的库&#xff0c;但是运行QT交叉编译之后的可执行文件报错&#xff1a; qt.qpa.plugin: Could not find the Qt platform plugin "eglfs" in "" This application failed to start because no Qt platf…

Linux 理解进程信号

目录 一、共享内存通信机制中的临界资源访问与同步控制 1、概念 2、生活角度理解信号机制 3、信号量的操作 二、信号 1、生活角度的信号 2、技术应用角度的信号 3、操作系统角度的信号 信号如何产生 理解组合键变为信号 理解信号如何被进程保存 时钟中断&#xff0…

【面试题】RocketMQ如何保证消息不丢失?

前言&#xff1a;在面试的时候如果你会用消息中间件&#xff0c;那么面试一般都会问到MQ是如何保证消息不丢失的这个问题&#xff0c;所以这个问题对于面试和日常工作都非常之重要&#xff0c;本文主要讲述RocketMQ是如何保证消息不丢失的&#xff0c;但是我们可以举一反三&…