java8 (jdk 1.8) 新特性——Lambda 以及函数式接口

news2024/12/26 11:26:40

1. 什么是lambda?

目前已知的是,有个箭头 ->

说一大段官方话,也没有任何意义

我们直接看代码:

之前我们创建线程是这样的

 Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("run。。。。。。");
            }
        };
        runnable.run();

用lambda:

    Runnable run2 = () -> System.out.println("run。。。。。。");
        run2.run();

在这里插入图片描述
初次认识可能会觉得有点离谱,看不懂

别急,还有更离谱的

很常见的一个例子,比较两个整数的大小

之前是这样写的

Comparator<Integer> myCom = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1, o2);
            }
        };

        int compare = myCom.compare(12, 20);
        int compare1 = myCom.compare(20, 12);
        int compare2 = myCom.compare(20, 20);
        System.out.println(compare);
        System.out.println(compare1);
        System.out.println(compare2);
    }

用lambda:

   Comparator<Integer> myCom = (o1, o2) -> Integer.compare(o1, o2);

        int compare = myCom.compare(12, 20);
        int compare1 = myCom.compare(20, 12);
        int compare2 = myCom.compare(20, 20);
        System.out.println(compare);
        System.out.println(compare1);
        System.out.println(compare2);

甚至还可以这样 (这个是方法引用)

 Comparator<Integer> myCom = Integer::compare;

        int compare = myCom.compare(12, 20);
        int compare1 = myCom.compare(20, 12);
        int compare2 = myCom.compare(20, 20);
        System.out.println(compare);
        System.out.println(compare1);
        System.out.println(compare2);

第一个数比第二个数

大 :返回 1

小:返回 -1

相等:返回 0

在这里插入图片描述
刚接触是不是黑人问号,这是什么玩意

很好,到这,你认识到了lambda 一个缺点,可阅读性差 ,优点 代码简洁

小结:看到 -> lambda 看到 : : 方法引用

2. lamdba 语法

基本语法

  1. 箭头操作符 -> 或者叫做lambda 操作符

  2. 箭头操作符将lambda 表达式拆分成两部分

    左侧:Lambda 表达式的参数列表

    右侧:Lambda 表达式中所需执行的功能 , 即 Lambda 体

3. 语法格式

- 语法格式1:无参数,无返回值


 () -> system.out.println("Hello Lambda")   

前边线程的那个例子就是了

在这里插入图片描述

- 语法格式2:有一个参数 无返回值


 (x)-> System.out.println(x);

若只有一个参数可以省略不写


   x-> System.out.println(x);

之前的写法,没有使用lambda


 Consumer<String> consumer = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println("输出的值:"+s);
            }
        };
        
        consumer.accept("今天不想emo了");

使用lambda

Consumer<String> consumer = s -> System.out.println("输出的值:"+s);

        consumer.accept("今天不想emo了");

- 语法格式3:有两个以上参数 ,并且lambda体有多条语句,有返回值

 Comparator<Integer> myCom = (o1, o2) -> {
            System.out.println("其他语句");
            return Integer.compare(o1, o2);
        };
  • 语法格式4 lambda体中只有一条语句,return 和 大括号都可以省略不写
Comparator<Integer> com  =(x,y)-> Integer.compare(x,y);

有没有发现所有的参数,都没有参数类型,之前我们写函数的时候可是要带上参数类型的

  • 语法格式5 lambda表达式参数列表的数据类型可以省略不写,因为JVM编译器通过上下文编译推断出数据类型——类型推断

4. 函数式接口

不管上面哪一种语法格式,lambda都是需要函数式接口的支持

函数式接口:接口中只有一个抽象方法的接口 称为函数式接口

可以使用一个注解@FunctionalInterface 修饰,可以检查是否是函数式接口

我们可以看看Runnable 接口 的源码

完成的接口类代码如下


/*
 * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
 *  ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms
 /

package java.lang;
/**
 * The <code>Runnable</code> interface should be implemented by any
 * class whose instances are intended to be executed by a thread. The
 * class must define a method of no arguments called <code>run</code>.
 * <p>
 * This interface is designed to provide a common protocol for objects that
 * wish to execute code while they are active. For example,
 * <code>Runnable</code> is implemented by class <code>Thread</code>.
 * Being active simply means that a thread has been started and has not
 * yet been stopped.
 * <p>
 * In addition, <code>Runnable</code> provides the means for a class to be
 * active while not subclassing <code>Thread</code>. A class that implements
 * <code>Runnable</code> can run without subclassing <code>Thread</code>
 * by instantiating a <code>Thread</code> instance and passing itself in
 * as the target.  In most cases, the <code>Runnable</code> interface should
 * be used if you are only planning to override the <code>run()</code>
 * method and no other <code>Thread</code> methods.
 * This is important because classes should not be subclassed
 * unless the programmer intends on modifying or enhancing the fundamental
 * behavior of the class.
 *
 * @author  Arthur van Hoff
 * @see     java.lang.Thread
 * @see     java.util.concurrent.Callable
 * @since   JDK1.0
 */
@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

在这里插入图片描述
可以看到这里面就只有一个实现,有一个注解@FunctionalInterface ,说明它就是一个函数式接口,就可以进行lambda简写

来看 Comparator 也是一样 有@FunctionalInterface注解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里可能就会有疑问,这边明明是有两个抽象方法,怎么是函数式接口呢?

别急 !!可以看到这边的注释, 说明这个equals 是 重写了超类 的 equals,本质上是对object 的重写,官方定义这样的抽象方法是不会被定义到 抽象接口数的 ,因此实际上只有一个抽象方法

在这里插入图片描述
我们自己可以试着定义 函数式接口,很简单


package com.test1.demo;


@FunctionalInterface
public interface MyFunc {

    void  method();
    
}

好了,如果,写两个抽象接口会怎样?

在这里插入图片描述
可以看到注解报错了,所以注解用来校验作用就在这

重申一遍,函数式接口:接口中只有一个抽象方法的接口 称为函数式接口

注解只是拿来校验的,方便我们一看就知道这是一函数式接口类,不然还得数个数,验证一下是不是只有一个

现在我也重写 equals ,可以看到并没有报错

在这里插入图片描述

5. java8 中内置四大核心函数式接口

  • Consumer 消费型接口
/Consumer  消费型接口
    @Test
    public void testConsumer() {
        cosumer(1000, (m) -> System.out.println("星期一" + m)); 
        // 星期一1000.0
    }

    public void cosumer(double m, Consumer<Double> con) {
        con.accept(m);
    }
  • 供给型接口 supplier

@Test
    public void testSupplier() {
        List<Integer> numList = getNumList(10, () -> (int) (Math.random() * 100));
        for (Integer integer : numList) {
            System.out.println(integer); //100 以内10位随机整数
        }
    }

    // 需求:产生指定个数的整数放入集合中
    public List<Integer> getNumList(int num, Supplier<Integer> su) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            Integer integer = su.get();
            list.add(integer);
        }
        return list;
    }
  • Function<T,R> 函数型接口
@Test
    public void  FunctioStr(){
        String c = getFunction("sbjikss", str -> str.toUpperCase());
        System.out.println(c); //SBJIKSS
        String sub = getFunction("sbjikss", str -> str.substring(2, 3));
        System.out.println(sub);//j
    }

    public  String  getFunction( String str, Function<String,String> f) {
        return f.apply(str);
    }
  • 断言型接口 Predicate
public  void  tetPre(){
         List<String> list = Arrays.asList("Hello","sss","xxxx","sjjss");
        List<String> list1 = filterStr(list, (pre) -> pre.length() > 3);
        for (String s : list1) {
            System.out.println(s);  // Hello xxxx  sjjss
        }
    }
   //需求:将满足条件字符串放入集合中
    public  List<String>  filterStr(List<String> old , Predicate<String> pre ){
        List<String> newList  = new  ArrayList<>();
        for (String str : old) {
            if (pre.test(str)){
               newList.add(str);
            }
        }
        return newList;
    }

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

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

相关文章

阿里云服务器的网络性能如何?有多快?是否适合高流量应用?

阿里云服务器的网络性能如何&#xff1f;有多快&#xff1f;是否适合高流量应用&#xff1f;   [本文由阿里云代理商[聚搜云www.4526.cn]撰写]    阿里云服务器网络性能简介   阿里云服务器&#xff08;ECS&#xff09;在网络性能方面表现卓越&#xff0c;可满足用户对高…

通过环路分析仪得到系统的闭环传递函数方法(Matlab System Identification)

目录 前言 环路分析仪数据整理 Matlab导入环路分析仪的数据 System Identification使用 闭环传递函数导出 总结 前言 之前开发的时候通过Matlab的环路设计工具实现了控制系统的补偿器参数整定&#xff0c;然后在系统硬件上面进行了验证&#xff0c;设计带宽和环路分析仪的…

基于Java实验中心管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

排序算法:插入排序(直接插入排序、希尔排序)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关排序算法的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…

CQ 社区版 v2.1.0 发布 | 新增数据发布变更、内置脱敏规则等功能

Hello&#xff0c;社区的小伙伴们&#xff0c;又到了每月版本发布时间。&#x1f389;&#x1f389;&#x1f389; 本次社区版更新带来了新功能 「发布变更」&#xff0c;以及内置脱敏规则、授权粒度细化、连接池管理、变更链接密钥等&#xff0c;信息量不少&#xff0c;一起来…

在生信中利用Chat GPT/GPT4

论文链接Ten Quick Tips for Harnessing the Power of ChatGPT/GPT-4 in Computational Biology | Papers With Code 之前在paper with code上比较火的一篇文章&#xff0c;最近要给生科的学长学姐们个分享所以把这个翻了翻&#xff0c;原文自认为废话比较多&#xff0c;于是选…

基于Java物流管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

【图书推荐 | 14】后端系列

【赠书活动第十四期 】 图书推荐 本期书籍&#xff1a;后端系列 图书列表 本期图书列表&#xff1a; Spring Cloud 微服务快速上手项目驱动零起点学JavaNode.js 从基础到项目实战Diango Web 开发实例精解Flask Web 全栈开发实战精通Hadoopsmysql 数据库基础与实战应用Neo4j 图谱…

ChatGLM-6B云服务器部署教程

目录 一、准备服务器1.购买服务器2.开机进入终端3.进入终端 二、部署ChatGLM1.执行命令2.本地代理访问地址2.1 结果如下2.2 api接口一样操作 三、Fastapi流式接口1.api_fast.py1.2 将api_fast.py上传到服务器 2.准备插件3.访问地址 博客园地址&#xff1a;https://www.cnblogs.…

【裸机开发】中断系统 —— IRQ 中断服务函数(汇编部分)

IRQ 和前面的Reset 函数不大一样&#xff0c;当一个IRQ中断产生时&#xff0c;我们也不知道这个IRQ中断来自哪个外设&#xff0c;因此&#xff0c;需要先获取到中断ID&#xff0c;随后才会跳转到真正的中断服务函数执行处理逻辑。 整个 IRQ 中断处理可以看做是包含了两个部分&…

CSS查缺补漏之选择器

最近在复盘CSS基础知识&#xff0c;发现很多CSS选择器里面还是大有学问&#xff0c;需要详细总结一番&#xff0c;以备差缺补漏~ 作为CSS基础的一大类别&#xff0c;选择器又分为多种类别&#xff0c;本篇内容默认读者已了解并掌握基础选择器【通配符选择器】、【元素选择器】…

springboot+vue项目之MOBA类游戏攻略分享平台(java项目源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的MOBA类游戏攻略分享平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xf…

自动化测试框架Playwright安装以及使用

最近&#xff0c;微软开源了一个非常强大的自动化项目叫 playwright-python 它支持主流的浏览器&#xff0c;包含&#xff1a;Chrome、Firefox、Safari、Microsoft Edge 等&#xff0c;同时支持以无头模式、有头模式运行&#xff0c;并提供了同步、异步的 API&#xff0c;可以…

C++学习——第二节课-输入输出

大家好&#xff0c;我是涵子。今天我们来学习C中的输入输出。 一、电脑中的输入输出 日常生活中常见的电脑、手机、电视机外部接口&#xff0c;也就是I/O&#xff08;输入/输出&#xff09;接口部分&#xff0c;其样式、种类较多&#xff0c;不同的接口配置也体现了设备的档次…

SpringBoot整合jwt+redis+随机验证码+Vue的登录功能

一、运行效果展示 &#xff01;注意&#xff1a;前端的Vue项目中要引入element-ui和axios # npm安装element-ui、axios npm insatll element-ui -S npm install axios -S # 在main中引入 // 引入ElementUI import ElementUI from element-ui import element-ui/lib/theme-chalk…

springboot动态加载json文件

resources下面的配置文件&#xff0c;application文件修改启动会实时加载新的内容 其他的文件属于静态文件&#xff0c;打包后会把文件打入jar里面&#xff0c;修改静态文件启动不会加载新的内容 Resource areacode nre FileSystemResource("config" File.separa…

技术分享——数据安全之数据分类方法小集

背景 2021年6月10日&#xff0c;《中华人民共和国数据安全法》&#xff08;以下简称“《数安法》”&#xff09;通过了第十三届全国人民代表大会常务委员会第二十九次会议并予以发布&#xff0c;标志着我国数据安全工作进入到有法可依的新阶段。 本文通过梳理现有的部分法规、…

Fiddler Orchestra从安装到实战演练

上次谈到了Fiddler Orchestra用户指南&#xff0c;这次笔者把自己的实战演练分享大家&#xff0c;闲话少说&#xff0c;步骤如下&#xff1a; 1、根据前面文章《Fiddler Orchestra用户指南》&#xff0c;Fiddler Orchestra客户端和控制器只能运行在至少支持.NET Standard 2.0的…

Redis入门(一)

第1章 NoSQL 1.1 NoSQL数据库 1.1.1 NoSQL是什么 &#xff08;1&#xff09;NoSQL(Not Only SQL )&#xff0c;意即“不仅仅是SQL”&#xff0c;泛指非关系型的数据库。 &#xff08;2&#xff09;NoSQL不拘泥于关系型数据库的设计范式&#xff0c;放弃了通用的技术标准&…

MyAQL事务

目录 ----------------------MySQL 事务-------------------------------- 1&#xff0e;事务的概念 2&#xff0e;事务的ACID特点 ●原子性 ●一致性 ●隔离性 事务隔离级别的作用范围分为两种&#xff1a; ●持久性 3&#xff0e;事务控制语句 案例&#xff1a; 4…