java8之lambda表达式简介

2023-10-27

1、概念

lambda是一个匿名函数,我们可以吧lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,是java的语言表达能力得到了提升。
写法的对比

//原来的匿名内部类
    @Test
    public void test1(){
        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1,o2);
            }
        };
        int compare = comparator.compare(1, 2);
        System.out.println(compare);
    }

    //Lambda表达式
    @Test
    public void test2(){
        Comparator<Integer> comparator = (x,y) -> Integer.compare(x,y);
        int compare = comparator.compare(2, 1);
        System.out.println(compare);
    }

2.基础语法

java8中引入了一个新的操作符“->” 该操作符称为箭头操作符或Lambda操作符,箭头操作符将Lambda表达式拆分成两部分
左侧:Lambda 表达式的参数列表,接口中实现方法的参数列表
右侧:Lambda 表达式中所需执行的功能,即Lambda体,接口实现函数的功能

2.1 语法格式一

  • 无参数,无返回值
  • () -> System.out.println(“helloword!”);
	@Test
    public void test1(){
        //原写法
        Runnable run1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("HelloWord!");
            }
        };
        run1.run();

        //Lambda写法
        Runnable run2 = () -> System.out.println("Lambda..HelloWorld!");
        run2.run();
    }

2.2 语法格式二

  • 有一个参数,无返回值
  • (x) -> System.out.println(x)
	@Test
    public  void test2(){
        Consumer con = (x) -> System.out.println(x);
        con.accept("迪迦!");
    }

2.3 语法格式三

  • 若只有一个参数,无返回值,小括号可以不写
  • x -> System.out.println(x)
	@Test
    public  void test2(){
        Consumer con = x -> System.out.println(x);
        con.accept("迪迦!");
    }

2.4 语法格式四

  • 有两个以上的参数,并且Lambda体中有多条语句,Lambda必须有大括号包起来
  • (o1,o2) -> {
    System.out.println(“函数式接口!”);
    return Integer.compare(o1,o2);
    }
@Test
    public void test3(){
        Comparator<Integer> comparator = (o1,o2) -> {
            System.out.println("函数式接口!");
            return Integer.compare(o1,o2);
        };

        System.out.println(comparator.compare(1,2));
    }

2.5 语法格式五

  • 若Lambda体中只有一条语句,return 和 大括号都可以省略不写
  • (o1,o2) -> Integer.compare(o1,o2)
@Test
    public void test3(){
        Comparator<Integer> comparator = (o1,o2) -> Integer.compare(o1,o2);
        System.out.println(comparator.compare(1,2));
    }

2.6 语法格式六

  • Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
  • (Integer o1,Integer o2) -> Integer.compare(o1,o2)
//类型推断
String[] strs = {"aaa","bbb","ccc"};
@Test
    public void test3(){
        Comparator<Integer> comparator = (Integer o1,Integer o2) -> Integer.compare(o1,o2);
        System.out.println(comparator.compare(1,2));
    }

3.Lambda 表达式需要“函数式接口”的支持

函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。可以使用注解@FunctionInterface修饰可以检查是否式函数式接口

@FunctionalInterface
public interface MyInterface<T> {

    public String getString(T str);
}

4、java内置四大核心函数式接口

4.1 Consumer

  • 消费型接口:提供一个参数,不返回
/**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);
  • 举例
@Test
    public void testConsumer(){
        Consumer<Long> consumer = x -> System.out.println("迪迦抹除了" + x + "头怪兽!");
        consumer.accept(5L);
    }

4.2 Supplier

  • 供给型接口:,没有参数,获取一个值
/**
     * Gets a result.
     *
     * @return a result
     */
    T get();
  • 举例
@Test
    public void testSupplier(){
        Supplier<String> supplier = () -> "我是迪迦!";
        System.out.println(supplier.get());
    }

4.3 Function<T, R>

  • 函数型接口:传进去一个参数,返回一个参数
/**
     * Applies this function to the given argument.
     *
     * @param t the function argument
     * @return the function result
     */
    R apply(T t);
  • 举例
@Test
    public void testFunction(){
        String ABC = handlerString("abc", (str) -> str.toUpperCase());
        System.out.println(ABC);
    }

    public String handlerString(String str,Function<String,String> fun){
        return fun.apply(str);
    }

4.4 Predicate

  • 断言型接口
/**
     * Evaluates this predicate on the given argument.
     *
     * @param t the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false}
     */
    boolean test(T t);
  • 举例
 @Test
    public void testPredicate(){
        List<String> list = Arrays.asList("aaa","bbbb","ccccc","dddddd");
        List<String> newList = filterStringLength(list, x -> x.length() > 3);
        System.out.println(newList);
    }

    public List<String> filterStringLength(List<String> list,Predicate<String> predicate){
        List<String> newList = new ArrayList<>();
        for (String str : list) {
            if (predicate.test(str)){
                newList.add(str);
            }
        }
        return newList;
    }

5.方法引用

  • 方法引用:若Lambda体中的内容有方法已经实现了,我们可以使用“方法引用”(可以理解为方法引用是Lambda表达式的另外一种表现形式)
  • 备注①:已有方法的参数列表和返回值必须与Lambda接口抽象方法的参数列表和返回值一致。
  • 备注②:若Lambda 参数列表中的第一参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以使用ClassName::method

5.1 对象::实例方法名

例如:accept方法的参数和返回值与println方法的参数和返回值一致。

void accept(T t);
public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }
@Test
    public void test5(){
        //println和
        PrintStream out = System.out;
        Consumer consumer = x -> System.out.println(x);
        Consumer consumer1 = out::println;
        Consumer consumer2 = System.out::println;
    }

5.2 类::静态方法名

Comparator<Integer> comparator = (o1,o2) -> Integer.compare(o1,o2);
        Comparator<Integer> comparator1 = Integer::compareTo;

5.3 类::实例方法名

BiPredicate<String,String> biPredicate = (x,y) -> x.equals(y);
        biPredicate.test("a","aa");
        BiPredicate<String,String> biPredicate1 = String::equals;
        biPredicate1.test("a","aa");

6.构造器引用

  • 格式:ClassName::new
Supplier<String> supplier = () -> new String();
        Supplier<String> supplier1 = String::new;
        System.out.println("supplier = " + supplier.get());
        System.out.println("supplier1 = " + supplier1.get());

7.数组引用

  • type[]::new;
Function<Integer,String[]> function = (x) -> new String[x];
        String[] apply = function.apply(2);
        System.out.println(apply.length);

        Function<Integer,String[]> function1 = String[]::new;
        String[] apply1 = function1.apply(3);
        System.out.println(apply1.length);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java8之lambda表达式简介 的相关文章

随机推荐

  • 虚拟机的防火墙设置指令

    查看防火墙服务状态 systemctl status firewalld 开启防火墙 service firewalld start 关闭防火墙 service firewalld stop 重启防火墙 service firewalld
  • 权限管理02-前台左侧菜单栏实现(根据用户获取菜单树)

    实现技术 vue element ui 1 后台管理主页布局
  • Qt 信号和槽机制

    这篇文章篇幅很长 阅读可能需要10分钟以上 如果你是Qt的初学者 前面的6个章节就已经够用了 至少能够让你在一些普通的场面撑得起场子 但如果你想了解的更深一点 最后一个章节是必不可少的内容 Qt提供了很多我们学习的文档 甚至是源码 阅读源码
  • wenda+chatGLM-6B构建本地知识库过程记录(含问题)

    目录 本机环境 搭建过程 1 下载wenda项目 2 准备虚拟环境 3 修改配置文件 4 知识库预先构建索引 问题记录 本机环境 OS Win11 显卡 RTX 4090 GPU使用情况 搭建过程 1 下载wenda项目 项目地址 GitH
  • QString 乱谈(3)-Qt5与中文

    两个月前 简单写过QTextCodec中的setCodecForTr等终于消失了 Qt5 在Qt论坛上 不少用户都对去掉这两个函数表示特别的不了解 为什么会这样 我想多少能说明不少用户对C 中源码字符集和执行字符集的不太了解 从而造成对这种
  • 02=windows下安装PostgreSQL(The database cluster initialisation failed)

    The database cluster initialisation failed windows下安装报错 The database cluster initialisation failed 我没找到解决方法 win10下报错 win
  • tpcc-mysql_TPCC-MySQL安装、使用及结果解读

    tpcc mysql用于MySQL基准测试 percona基于TPC C 下面简写成TPCC 衍生出来的产品 下面对tpcc mysql进行安装然后使用 最后结果解读 安装very easy let s do it 一 下载epel源 ro
  • 关于解决安装ubuntu双系统中出现的不能识别磁盘分区、空闲空间变不可用问题

    分享交流 谢谢指正 仅供参考 最近给自己电脑重装了windows系统 win7旗舰版 然后就索性又装了ubuntu的Linux套件 弄个双系统 方便今后的Linux学习 其中在分区挂载点这一块也碰到了不少问题 花了些功夫 好在都解决了 现在
  • ubuntu22.04编译安装gcc12.2

    ubuntu22 04编译安装gcc12 2 更新apt sudo apt get update 安装wget sudo apt get install wget zlib2 make 3 下载相应版本的gcc安装包 把下面的地址换成相应版
  • C++:this

    this 它指向当前对象 通过它可以访问当前对象的所有成员 所谓当前对象 是指正在使用的对象 例如对于stu show stu 就是当前对象 this 就指向 stu this 只能用在类的内部 通过 this 可以访问类的所有成员 包括
  • H264码流RTP封装方式详解

    H264码流RTP封装方式详解 文章目录 H264码流RTP封装方式详解 1 H264基本概念 2 NALU Header介绍 3 RTP封装H264码流 3 1 单一NALU模式 3 2 组合帧封装模式 3 3 分片封装模式 4 代码解析
  • Qt的4种多线程实现方式

    一 QThread类的run 一 实现方法 新建一个集成QThread的类 重写虚函数run 通过run启动线程 二 示例 class WorkerThread public QThread Q OBJECT void run overri
  • Oracle drop if exists

    参考https stackoverflow com questions 1799128 oracle if table exists 我的官方博客http blog alei tech 转载请注明 网页地址https alei tech 2
  • 参考文献必备神器:这个插件能快速知道收藏的论文是否靠谱

    贾浩楠 发自 凹非寺 量子位 报道 公众号 QbitAI AI读文献 又有新的黑科技上线了 专攻AI分析论文内容的Scite最近刚刚开源了scite zotero plugin工具 scite zotero plugin能自动将论文中的引用
  • 97 条 Linux 运维工程师常用命令总结

    ls mv cp scp rm touch pwd cd mkdir rmdir echo cat more less nl head tail vi vim which whereis locate 数据库快速搜寻档案 find grep
  • “泰迪杯”挑战赛-通过图像处理和数据挖掘实现车辆检测与跟踪

    目 录 挖掘目标 分析方法与过程 2 1 总体流程 2 2 具体步骤 2 3 结果分析 结论 参考文献 1 挖掘目标 在建设平安城市的进程中 安全是政府日常管理工作中的重要任务 随着城市报警和监控系统的建设 对于监控数据的分析也日显重要 本
  • powerdesigner物理视图 导出建库脚本(mysql)

    第一步 设置powerdesigner 物理视图 导出数据库类型 菜单栏 DataBase 数据库 generate Database 第二步 设置Powerdesigner 物理视图 导出数据库语言类型 第三步 根据第二步的相关配置 进行
  • web.xml文件详解

    前言 一般的web工程中都会用到web xml web xml主要用来配置 可以方便的开发web工程 web xml主要用来配置Filter Listener Servlet等 但是要说明的是web xml并不是必须的 一个web工程可以没
  • Python错误提示:TypeError: sequence item 2: expected str instance, int found

    我们知道在对list进行拼接 对字符串进行拼接的时候可以使用 join 但是在将list进行拼接转换为字符串的时候报错 大家可以对比看一下 list01 name age 20 s join list01 print s try list0
  • java8之lambda表达式简介

    文章目录 1 概念 2 基础语法 2 1 语法格式一 2 2 语法格式二 2 3 语法格式三 2 4 语法格式四 2 5 语法格式五 2 6 语法格式六 3 Lambda 表达式需要 函数式接口 的支持 4 java内置四大核心函数式接口