Java 8 Lambda 表达式

news2024/11/20 15:16:09

目录

出现的背景

外部类

代码

运行

内部类

代码

运行

匿名内部类

代码

运行

Lambda 表达式简介

Lambda 表达式的结构

lambda表达式

代码

运行

什么是功能接口(Functional interface)

代码

接口

实现类

使用方法重写

使用lambda表达式

运行


出现的背景

匿名函数  为了简化Java中的匿名内部类

事件监听 写一个类实现 ActionListener 接口(外部类)

\|/

内部类  类在其他地方用不到,索性就把这个类定义在类的内部使用

             好处:1.内部可以使用外部类的成员

                        2.其他地方发现不了

\|/

往往内部类至使用一次,还要创建一个内部类,麻烦

Java为了简化语法,new 接口/抽象类  创建了一个匿名的类的对象

外部类

代码

package com.ffyc.demo;

import java.util.ArrayList;

public class Demo1 {
    public static void main(String[] args) {

        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("a");

        //排序,定义排序规则
        arrayList.sort(new StringComparator());
        System.out.println(arrayList);
    }
}
package com.ffyc.demo;

import java.util.Comparator;

public class StringComparator implements Comparator<String> {
    public static void main(String[] args) {

    }

    @Override
    public int compare(String o1, String o2) {
        return o1.compareTo(o2);
    }
}

运行

内部类

代码

package com.ffyc.demo;

import java.util.ArrayList;
import java.util.Comparator;

public class Demo1 {
    public static void main(String[] args) {

        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("a");

        //排序,定义排序规则
        arrayList.sort(new StringComparator());
        System.out.println(arrayList);
    }
    /*
      内部类来实现接口
    */
    static class StringComparator implements Comparator<String> {

        @Override
        public int compare(String o1, String o2) {
            return o1.compareTo(o2);
        }
    }
}

运行

匿名内部类

代码

package com.ffyc.demo;

import java.util.ArrayList;
import java.util.Comparator;

public class Demo1 {
    public static void main(String[] args) {

        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("a");

        //排序,定义排序规则 

        //匿名内部类,为了减少类的创建
        //此处功能核心是compareTo方法,但是Java是面向对象的,方法的不能独立存在的,必须将方法包装在对象中
        arrayList.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });

        System.out.println(arrayList);
    }
}

运行

Java8之前,函数/方法是不能当作参数传递的,必须将函数包装在对象中。

但是核心就是函数完成某个功能而已,还需要创建一个对象,成本高。

Java8开始,对这一语法进行了简化,匿名内部类都不需要创建了,直接将函数作为参数传递了。

Lambda 表达式简介

lambda 是匿名函数,把函数当作参数一样传递

lambda是一个“语法糖”,就是一个名词,某种语法可以简化开发称为语法糖

装箱  拆箱

自动类型转换

泛型

Lambda 表达式的结构

(参数列表)->{函数体}
()->{
            
}     

lambda表达式

代码

package com.ffyc.demo;

import javax.swing.*;
import java.util.ArrayList;
import java.util.Comparator;

public class Demo1 {
    public static void main(String[] args) {

        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("b");
        arrayList.add("c");
        arrayList.add("a");

        //排序,定义排序规则
        arrayList.sort((a,b)->{

            return a.compareTo(b);
        });

        System.out.println(arrayList);

        new JButton().addActionListener((e)->{
            System.out.println(e.getWhen());
        }); 
    } 
}

运行

什么是功能接口(Functional interface)

Lambda 表达式只支持函数式接口 也就是只有一个抽象方法的接口.功能 接口是 java 8 中的新增功能,它们只允许一个抽象方法。这些接口也称为单抽 象方法接口。Java 8 也引入了一个注释,即@FunctionalInterface,当你注释 的接口违反了 Functional Interface 的契约时,它可以用于编译器级错误。

代码

接口

package com.ffyc.demo;

//使用lambda表达式 也是有要求的,一个接口中只能有一抽象方法
//为什么?因为函数是匿名的,全靠语法的推断
@FunctionalInterface
//添加@FunctionalInterface注解的接口中,只能有一个抽象方法
public interface Computer {
    int add(int a,int b);

    //int sub(int a,int b);
}

当接口中定义了两个方法时,@FunctionalInterface会检测语法错误,会报错。

实现类

使用方法重写
package com.ffyc.demo;

public class Demo2 {

    static class comImpl implements Computer{

        @Override
        public int add(int a, int b) {
            return a+b;
        }
    }
    public void test(Computer computer){
        int res = computer.add(10, 20);
        System.out.println(res);
    }

    public static void main(String[] args) { 
        new Demo2().test(new comImpl()); 
    }
}
使用lambda表达式
package com.ffyc.demo;

public class Demo2 { 
    public void test(Computer computer){
        int res = computer.add(10, 20);
        System.out.println(res);
    }

    public static void main(String[] args) {
        //底层会将匿名对象包装到一个对象中,
        new Demo2().test((a,b)->{
            return a+b;
        }); 

        new Thread(()->{
            System.out.println("使用lambda创建了一个线程,并重写了run方法");
        }).start();
    }
}

运行

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

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

相关文章

解决 fatal: Not a git repository (or any of the parent directories): .git 问题

解决方法&#xff1a;在命令行 输入 git init 然后回车就好了

Aware接口作用

介绍 Aware&#xff08;感知&#xff09;接口是一个标记&#xff0c;里面没有任何方法,实际方法定义都是子接口确定&#xff08;相当于定义了一套规则&#xff0c;并建议子接口中应该只有一个无返回值的方法&#xff09;。 我们知道spring已经定义好了很多对象&#xff0c;如…

深入解析R语言的贝叶斯网络模型:构建、优化与预测;INLA下的贝叶斯回归;现代贝叶斯统计学方法;R语言混合效应(多水平/层次/嵌套)

目录 ①基于R语言的贝叶斯网络模型的实践应用 ②R语言贝叶斯方法在生态环境领域中的应用 ③基于R语言贝叶斯进阶:INLA下的贝叶斯回归、生存分析、随机游走、广义可加模型、极端数据的贝叶斯分析 ④基于R语言的现代贝叶斯统计学方法&#xff08;贝叶斯参数估计、贝叶斯回归、…

Python 实现批量文件重命名工具

在现代软件开发中&#xff0c;图形用户界面 (GUI) 工具的创建是一个常见需求。对于那些需要频繁处理文件的任务&#xff0c;拥有一个简便的 GUI 工具尤为重要。在这篇博客中&#xff0c;我们将介绍如何使用 wxPython 创建一个简单的批量文件重命名工具。该工具可以选择一个文件…

AWS EC2 连接 AWS RDS(Mysql)

1 创建RDS数据库 点击创建数据库 引擎选项 模板 设置 连接 2 EC2连接Mysql $ sudo yum list mariadb* Installed Packages mariadb-connector-c.x86_64 3.1.13-1.amzn2023.0.3 amazonl…

Flutter笔记:Widgets Easier组件库-使用隐私守卫

Flutter笔记 Widgets Easier组件库&#xff1a;使用隐私守卫 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https:…

签发免费https证书的方式

目录 http访问和https访问的区别 实现https后有哪些好处&#xff1a; 如何申请、安装部署免费https证书&#xff1a; 在浏览网页时&#xff0c;最常见的是http访问&#xff0c;但是也有一部分网站前缀是https&#xff0c;且浏览器网址栏会出现“安全”字样&#xff0c;或是绿…

【C++】<图形库> EasyX基础使用

文章目录 一、安装EasyX库 二、图形窗口显示 三、基本绘图函数 四、图片显示 五、键盘交互 六、鼠标交互 七、双缓冲区解决闪屏 一、安装EasyX库 已经有兄弟写得很清楚了&#xff0c;见EasyX | 安装教程&#xff08;详细图文&#xff09;。 二、图形窗口显示 1. 包含的…

深度学习之基于Tensorflow+Flask框架Web手写数字识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手写数字识别是深度学习领域中的一个经典问题&#xff0c;也是计算机视觉领域的重要应用之一。…

【加密与解密(第四版)】第二十一章笔记

第二十一章 VMProtect逆向和还原浅析 21.1 VMProtect逆向分析 21.2 VMProtect的还原 不行了&#xff0c;一点都看不懂

centos7和centos8安装mysql5.6 5.7 8.0

https://dev.mysql.com/downloads/repo/yum/ 注意构造下http://repo.mysql.com/mysql-community-release-el*-*.noarch.rpm 【以centos7为例】 安装mysql5.6 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5…

推荐网站(17)audiohub免费音乐平台

今天&#xff0c;我要向您推荐一个非常实用的网站——AudioHub。这是一个提供免费音乐的平台&#xff0c;特别适合需要无版权音乐资源的创作者、视频制作人、播客主持人以及任何需要背景音乐的项目。里面的音乐无版权&#xff0c;可商用。 链接直达&#xff1a;https://audiohu…

移动硬盘不显示容量与无法访问问题的解决方案及预防措施

在日常生活和工作中&#xff0c;移动硬盘已成为我们存储数据的重要工具。然而&#xff0c;当遇到移动硬盘不显示容量或无法访问的情况时&#xff0c;我们该如何应对&#xff1f;本文将详细介绍这一问题的现象、原因&#xff0c;并提供两种有效的数据恢复方案&#xff0c;同时还…

深度学习之基于Pytorch框架多人多摄像头摔倒跌倒坠落检测

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着智能监控技术的广泛应用&#xff0c;对于公共场合的安全监控需求日益增加。摔倒跌倒坠落是常见的…

申请公众号数量达标

一般可以申请多少个公众号&#xff1f;目前企业主体只能申请2个公众号&#xff0c;这也意味着想做矩阵公众号的难度提升了。有些公司靠着诸多不同分工的公众号形成一个个矩阵&#xff0c;获取不同领域的粉丝。比如&#xff0c;目前主体为xx旗下公众号&#xff0c;共有30个&…

太阳诱电:顺应时代需求的新型电容器为何能在全球得到广泛应用(下)

随着汽车电动化和电子控制化的进展&#xff0c;车载计算机和电气部件也在逐渐向大功率化的方向发展。而构成这些车载设备电源电路的电子元器件也必须随之进行技术革新。太阳诱电集团携手全资子公司ELNA&#xff0c;开发并供应新型电容器“导电性高分子混合铝电解电容器”&#…

Vue前端项目打包,并部署Vue项目到Linux云服务器上

一. vue前端项目打包 1.使用vscode开发项目 2.在config目录下的prod.env.js文件当中配置我们后端服务器的IP地址和端口号&#xff0c;因为这是在实际的部署当中所以必须要在生成环境下进行项目的部署。 如图所示&#xff1a; 3.在config目录下的index.js文件当中要改assetsPu…

chrome125.0.6422.60驱动包下载

百度网盘地址:https://pan.baidu.com/s/1DAr_O58GQ6m4sk_QePZscA?pwd=5t0j 提取码:5t0j Chrome驱动包(ChromeDriver)是一个用于支持自动化测试的工具,它提供了对Google Chrome浏览器的控制,使您可以编写和运行自动化脚本来测试网站。这个驱动程序是由Selenium项目开…

今日arXiv最热大模型论文:LoRA又有新用途,学得少忘得也少,成持续学习关键!

自大模型&#xff08;LLM&#xff09;诞生以来&#xff0c;苦于其高成本高消耗的训练模式&#xff0c;学界和业界也在努力探索更为高效的参数微调方法。其中Low-Rank Adaptation&#xff08;LoRA&#xff09;自其诞生以来&#xff0c;就因其较低的资源消耗而受到广泛关注和使用…

Qt输入输出类使用总结

Qt输入输出类简介 QTextStream 类(文本流)和 QDataStream 类(数据流)Qt 输入输出的两个核心类,其作用分别如下: QTextStream 类:用于对数据进行文本格式的读/写操作,可在 QString、QIODevice或 QByteArray 上运行,比如把数据输出到 QString、QIODevice 或 QByteArray 对象…