lamda表达式(史上最全)

news2024/11/24 15:01:39

一、函数式接口

在jdk8中什么是函数式接口:

  1. 被@FunctionalInterface注解修饰的。
  2. 接口里边只有一个非default的方法。

满足以上2个条件的即为函数式接口,ps:即使一个接口没有@FunctionalInterface修饰,但是满足2,那么这样的接口也会是函数式接口。

二、函数式接口的特点

  • 接口有且仅有一个抽象方法,如上图的抽象方法compare
  • 允许定义静态非抽象方法
  • 允许定义默认defalut非抽象方法(default方法也是java8才有的,见下文)
  • 允许java.lang.Object中的public方法,如上图的方法equals。
  • FunctionInterface注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错

情况一

  • 接口有且仅有一个抽象方法,且加上了@FunctionInterface注解
@FunctionalInterface
public interface test_lamda {
    void show();
}

public class test {
    public static void main(String[] args) {
       test_lamda test_lamda=()->{
           System.out.println("test");
       };
       test_lamda.show();
    }
}

情况二

  • 接口有且仅有一个抽象方法,且没有加上了@FunctionInterface注解
public interface test_lamda {
    void show();
}

public class test {
    public static void main(String[] args) {
       test_lamda test_lamda=()->{
           System.out.println("test");
       };
       test_lamda.show();
    }
}

情况三

  • 使用java.lang.Object中的public方法
public interface test_lamda {
    void show();
    boolean equals(Object obj);
}

public class test {
    public static void main(String[] args) {
       test_lamda test_lamda=()->{
           System.out.println("test");
       };
       test_lamda.show();
    }
}

情况四

定义静态抽象方法,定义default

public interface test_lamda {
    void show();

    static void test1() {
        System.out.println("test");
    }

    default void test2() {
        System.out.println("test");
    }
}

public class test {
    public static void main(String[] args) {
       test_lamda test_lamda=()->{
           System.out.println("test");
       };
       test_lamda.show();
    }
}

情况五

定义两个抽象方法

public interface test_lamda {
    void show();
    
    void test();
}

三、Lamda表达式

1.背景

Java8的最大变化是引入了Lambda表达式,它是所有Java8特性内容的基础——一种紧凑的,传递行为的方式。lambda表达式允许你通过表达式来代替功能接口,lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体, Lambda 表达式(Lambda expression)可以看作是一个匿名函数,也称为闭包

2.Lambda表达式语法

基本语法: (parameters) -> expression 或 (parameters) ->{ statements; }

Lambda表达式由三部分组成:

  1. parameters:参数,类似方法中的形参列表,这里的参数是函数式接口里的参数
  2. ->:可理解为“被用于”的意思
  3. 方法体:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不反回,这里的代码块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不返回

3.Lambda表达式五种不同的形式

//1、无需要参数,使用空括号()表示没有参数。
//该Lambda表达式实现了Runnable接口,该接口也只有一个run方法,没有参数,返回值类型为void
Runnable noArguments = () -> System.out.println("Hello World")
// 2. 接收一个参数,可以省略括号,返回其2倍的值
x -> 2 * x
//3. Lambda表达式主体不仅可以是表达式,也可以是一段代码块,使用大括号{}将代码括起来。
() ->{
     System.out.println("Hello");
     System.out.println("World")
}
//4.Lambda表达式可以包含多个参数的方法。接受2个参数(数字),并返回他们的和
(x,y)->x+y;
//5.声明是参数类型,也可以是多个参数。接收2个int型整数,返回他们的和
(int x,int y)->x+y;

四、常用的函数式接口

首先我们要知道的是lamda表达式的引入是为了什么,是为了解决经常new对象的问题,解决使用匿名内部类的问题而产生的所以我们先看一下两者在使用上的区别

public class test {
    public static void main(String[] args) {
        //匿名内部类的方法
        startThread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程启动了" + Thread.currentThread().getName());
            }
        });

        startThread(()->{
            System.out.println("线程启动"+Thread.currentThread().getName());
        });

    }
    public static void startThread(Runnable r){
        Thread thread = new Thread(r);
        thread.start();
    }
}

从上面的代码上我们可以看出使用lamda表达式写出了的代码要比使用匿名内部类的方法便捷很多

Java8在java.util.function包下预定义了大量的函数数式接口供我们使用。

  • Supplier接口
  • Consumer接口
  • Predicate接口
  • Function接口

4.1、Supplier接口

Supplier:包含一个无参的方法

  • T get():获得结果
  • 该方法不需要参数,它会按照某种实现逻辑(由Lambda表达式实现)返回一个数据。
  • Supplier接口也称为生产型接口,如果我们指定了接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据供我们使用。

示例一

import java.util.function.Supplier;

public class test {
    public static void main(String[] args) {
        Supplier<String> supplier=()->{return "ltx";};
        String s = supplier.get();
        Supplier<Integer> supplier1=()->{return 1;};
        Integer integer = supplier1.get();
        System.out.println(s);
        System.out.println(integer);
    };
}

示例二

import java.util.function.Supplier;

public class test {
    public static void main(String[] args) {
        int []arr={1,2,3,4,5,6};
        int maxvalue=getMax(()->{
            int a=arr[0];
            for (int i = 0; i < arr.length; i++) {
                if(a<arr[i]){
                    a=arr[i];
                }
            }
            return a;
        });
        System.out.println(maxvalue);
    };
    public static Integer getMax(Supplier<Integer> s){
     return s.get();
    }
}

4.2、Consumer接口

Consumer:包含两个方法

  • void accept(T t):对给定的参数执行此操作。
  • default Consumer andThen(Consumer after):返回一个组合的Consumer,依次执行操作,然后执行after操作。
  • Consumer接口也称为消费型接口,它消费的数据的数据类型由泛型指定。

示例一:

import java.util.function.Consumer;

public class test {
    public static void main(String[] args) {
        Consumer<Integer> integerConsumer = System.out::println;
        integerConsumer.accept(1);

        Consumer<String> stringConsumer = name -> System.out.println(name);
        stringConsumer.accept("ltx");
    }
}

示例二:

package com.test10;

import java.util.function.Consumer;

public class ConsumerTest {
    public static void main(String[] args) {
        String[] arr={"唐青枫,20","曲无忆,21","离玉堂,22","叶知秋,23"};
        printInfo(arr,
                (String str)->{
                    String name=str.split(",")[0];
                    System.out.print("姓名:"+name);
                },
                (String str)->{
                    int age=Integer.parseInt(str.split(",")[1]);
                    System.out.println(",年龄:"+age);
                });
    }

    private static void printInfo(String[] arr, Consumer<String> con1, Consumer<String> con2){
        for(int i=0;i<arr.length;i++){
            con1.andThen(con2).accept(arr[i]);
        }
    }
}

4.3、Predicate接口

Predicate:常用的四个方法:

  • boolean test(T t):对给定的参数进行判断(判断逻辑由Lambda表达式实现),返回一个布尔值。
  • default Predicate negate():返回一个逻辑的否定,对应逻辑非。
  • default Predicate and(Predicate other):返回一个组合判断,对应短路与。
  • default Predicate or(Predicate other):返回一个组合判断,对应短路或。
  • Predicate接口通常用于判断参数是否满足指定的条件。
package com.test12;

import java.util.function.Predicate;

public class Demo {
    public static void main(String[] args) {
        //Lambda表达式
//        boolean b=checkString("Hello",(String str)->{
//            return str.length()>8;
//        });
        boolean b=checkString("Hello",str->str.length()>8);
        System.out.println(b);
        System.out.println("****************************");
        b=checkString1("Hello",str->str.length()>8);
        System.out.println(b);
    }

    private static boolean checkString(String str, Predicate<String> pre){
        return pre.test(str);
    }

    private static boolean checkString1(String str,Predicate<String> pre){
//        return !pre.test(str);
        //上一句等价于
        return pre.negate().test(str);
    }
}

4.4、Function接口

Function:常用的两个方法

  • R apply(T t):将此函数应用于给定的参数。
  • default Function andThen(Function after):返回一个组合函数,首先将该函数应用于输入,然后将after函数应用于结果。
  • Function:接口通常用于对参数进行处理,转换(处理逻辑由Lambda表达式实现),然后返回一个新的值。

示例

import java.util.function.Function;

public class test {
    public static void main(String[] args) {
        convert("666", Integer::parseInt);
        convert(666, String::valueOf);
        convert("666", Integer::parseInt, String::valueOf);
    }

    private static void convert(String s, Function<String,Integer> fun){
        int i=fun.apply(s);
        System.out.println(i);
    }

    private static void convert(Integer i,Function<Integer,String> fun){
        String s=fun.apply(i);
        System.out.println(s);
    }

    private static void convert(String s,Function<String,Integer> fun1,Function<Integer,String> fun2){
//        int i=fun1.apply(s);
//        String str=fun2.apply(i);
        String str=fun1.andThen(fun2).apply(s);
        System.out.println(str);
    }
}

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

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

相关文章

​TrustZone之可信固件

Trusted Firmware是Armv8-A设备的安全世界软件的开源参考实现。Trusted Firmware为SoC开发人员和OEM提供了一个符合相关Arm规格&#xff08;包括TBBR和SMCC&#xff09;的参考Trusted代码库。 以下图表显示了Trusted Firmware的结构&#xff1a; SMC调度程序处理传入的SMC。SMC…

LIGA-Stereo:为基于立体 3D 检测器的学习 LiDAR 几何感知表示

论文地址&#xff1a;https://openaccess.thecvf.com/content/ICCV2021/papers/Guo_LIGA-Stereo_Learning_LiDAR_Geometry_Aware_Representations_for_Stereo-Based_3D_Detector_ICCV_2021_paper.pdf 论文代码&#xff1a;https://github.com/xy-guo/LIGA-Stereo 摘要 基于立…

解决Maven找不到依赖的问题

如果经过Reload Maven项目&#xff0c;清除Idea缓存&#xff0c;甚至重启Idea等方法都解决不了Dependency xxx not found的问题&#xff0c;不妨试试手动安装。 1. 进入maven仓库&#xff0c;搜索自己需要的对应版本的依赖。 2. 点击下图红框jar图标下载对应的jar包&#xff0c…

CGAL的3D Alpha Shapes

假设我们给定一个二维或三维的点集S&#xff0c;我们希望得到类似“这些点形成的形状”的东西。这是一个相当模糊的概念&#xff0c;可能有许多可能的解释&#xff0c;阿尔法形状就是其中之一。阿尔法形状可用于从密集的无组织数据点集进行形状重建。事实上&#xff0c;阿尔法形…

基于比较的排序算法总结(java实现版)

目录 什么是基于比较的排序算法 什么是排序算法的稳定性 基础排序算法的稳定性 插入排序法 希尔排序法 冒泡排序法 总结 高级算法的稳定性 快速排序法 堆排序法 归并排序法 总结 注意 什么是基于比较的排序算法 基于比较的排序算法定义&#xff1a;之所以能给元素…

【银行测试】银行金融测试+金融项目测试点汇总...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、银行金融测试是…

案例101:基于微信小程序的停车共享小程序

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

微信小程序 动态设置状态栏样式

onLoad(options) {//修改状态栏标题wx.setNavigationBarTitle({title: 页面标题, //页面标题success: () > {}, //接口调用成功的回调函数fail: () > {}, //接口调用失败的回调函数complete: () > {} //接口调用结束的回调函数&#xff08;调用成功、失败…

CentOS 7 Tomcat服务的安装

前提 安装ava https://blog.csdn.net/qq_36940806/article/details/134945175?spm1001.2014.3001.5501 1. 下载 wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.84/bin/apache-tomcat-9.0.84.tar.gzps: 可选择自己需要的版本下载安装https://mirr…

Centos7在安装Graylog时新安装MongoDB报错端口不监听服务不启动无法运行启动失败

由于虚拟机服务器上需要安装Graylog需要安装MongoDB&#xff0c;尝试官网下载安装包&#xff0c;和yum安装均无法正常启动&#xff0c;折腾了好几天&#xff0c;重装了十几次&#xff0c;网上搜索了很多很多资料&#xff0c;均无法正常运行&#xff0c;百度上搜索各种文档&…

python三大开发框架django、 flask 和 fastapi 对比

本文讲述了什么启发了 FastAPI 的诞生&#xff0c;它与其他替代框架的对比&#xff0c;以及从中汲取的经验。 如果不是基于前人的成果&#xff0c;FastAPI 将不会存在。在 FastAPI 之前&#xff0c;前人已经创建了许多工具 。 几年来&#xff0c;我一直在避免创建新框架。首先&…

【python笔记】并发编程

前言 菜某的笔记总结分享。有错误请指正。 并发编程的意义 并发编程是用来提升代码执行的效率的。 名词理解 进程和线程 我们可以这样理解进程和线程。进程是一个工厂&#xff0c;线程是工厂里的一条流水线。 我们要让我们产品的生产效率提高&#xff0c;我们可以多开工…

基于多反应堆的高并发服务器【C/C++/Reactor】(上)

&#xff08;一&#xff09;初始化服务器端用于监听的套接字 Server.h #pragma once // 初始化监听的套接字 int initListenFd(unsigned short port); Server.c int initListenFd(unsigned short port) {// 1.创建监听的fdint lfd socket(AF_INET, SOCK_STREAM, 0);if(lf…

HTTP:HTTP报文

HTTP&#xff1a;HTTP报文 1. 报文流1.1 报文流入源端服务器1.2 报文向下游流动1.3 报文的组成部分1.3.1 报文的语法1.3.2 起始行1. 请求行2. 响应行3. 方法4. 状态码 如果说HTTP是因特网的信使&#xff0c;那么HTTP报文就是用它来搬东西的包裹了。 1. 报文流 HTTP报文是在…

最新国内免费使用GPT4教程,GPT语音对话使用,Midjourney绘画

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和用户进行创作交流。 然而&#xff0c;GP…

PHP字符串解析特性绕过WAF

[RoarCTF 2019]Easy Calc 题目的突破点&#xff1a; 只能传入数字和运算符号&#xff0c;不能传入字符&#xff08;想办法绕过waf&#xff09; 方法1. php解析规则&#xff1a;当php进行解析时&#xff0c;如果变量名前面有空格&#xff0c;php会自动去掉前面的空格再进行…

轻松搭建知识付费小程序:让知识传播更便捷

明理信息科技saas知识付费平台 在当今数字化时代&#xff0c;知识付费已经成为一种趋势&#xff0c;越来越多的人愿意为有价值的知识付费。然而&#xff0c;公共知识付费平台虽然内容丰富&#xff0c;但难以满足个人或企业个性化的需求和品牌打造。同时&#xff0c;开发和维护…

打破Tomcat中的双亲委派机制:探讨与实践

目录 引言 1. 双亲委派机制概述 2. 打破双亲委派机制的场景 3. Tomcat中的类加载器体系 4. 打破双亲委派机制的方法 4.1 在catalina.properties中配置common.loader 4.2 在META-INF/context.xml中配置Loader元素 4.3 编写自定义的类加载器 5. 潜在的问题与解决方案 5…

Shell编程自动化之特殊Shell扩展变量

1.变量的处理 1.1 如果parameter变量值为空&#xff0c;那么返回str字符串。 ${parameter:-str} 1.2 如果parameter变量值为空&#xff0c;那么str替代变量值&#xff0c;且返回其值。 ${parameter:str} 1.3 如果parameter变量值为空&#xff0c;那么str当作stderr输出&am…

Django 简单图书管理系统

一、图书需求 1. 书籍book_index.html中有超链接&#xff1a;查看所有的书籍列表book_list.html页面 2. 书籍book_list.html中显示所有的书名&#xff0c;有超链接&#xff1a;查看本书籍详情book_detail.html(通过书籍ID)页面 3. 书籍book_detail.html中书的作者和出版社&…