Java Lambda语法介绍

目录

一、概述

二、Lambda语法的历史

2.1 Lambda名字的含义

2.2 Lambda的历史

三、Lambda语法的核心接口

3.1 Lambda的四大核心接口

3.1.1 概述

3.1.2 Consumer 接口

3.1.3 Supplier 接口

3.1.4 Function 接口,>

3.1.5 Predicate 接口

四、Lambda的引用

4.1 概述

4.2 方法的引用

4.2.1 对象::实例方法

4.2.2 类::静态方法

4.2.3 类::实例方法

4.3 构造器的引用

4.4 数组的引用

五、Lambda的使用场景

5.1 简化编程

5.2 函数式接口

5.3 事件处理

5.4 并行处理


一、概述

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中),它允许我们以简洁、可读的方式表示匿名函数。通过Lambda表达式,我们可以将代码块作为参数传递给其他函数,从而实现更灵活的编程。

二、Lambda语法的历史

2.1 Lambda名字的含义

Lambda 这个名字 并不是一个什么的缩写,它是希腊第十一个字母 λ 的读音,同时它也是微积分函数中的一个概念,所表达的意思是一个函数入参和出参定义,在编程语言中其实是借用了数学中的 λ,并且多了一点含义,在编程语言中功能代表它具体功能的叫法是匿名函数(Anonymous Function),根据百科的解释:匿名函数在计算机编程中是指一类无需定义标识符(函数名)的函数或子程序。

2.2 Lambda的历史

说起Lambda 的历史,虽然它在 JDK8 发布之后才正式出现,但是在编程语言界,它是一个具有悠久历史的东西,最早在 1958 年在Lisp 语言中首先采用,而且虽然Java脱胎于C++,但是C++在2011年已经发布Lambda 了,但是 JDK8 的 LTS 在2014年才发布,现代编程语言则是全部一出生就自带 Lambda 支持。

三、Lambda语法的核心接口

3.1 Lambda的四大核心接口

3.1.1 概述

Java8为了我们方便编程,就为我们提供了四大核心函数式接口,分别是Consumer<T> : 消费型接口、Supplier<T> : 供给型接口、Function<T, R> : 函数型接口、Predicate<T> : 断言型接口,具体如下图所示:

3.1.2 Consumer<T> 接口

代码例子:

package main.java.com.ningzhaosheng.lambada.demo;

import java.util.function.Consumer;

/**
 * @author ningzhaosheng
 * @date 2024/6/27 17:57:21
 * @description Consumer接口 测试例子
 */
public class TestConsumer {

    public static void main(String[] args) {
        task(66.66,(m) -> System.out.println("本次一共花费"+m+ "元!!!"));
    }

    public static void task(double money, Consumer<Double> consumer){
         consumer.accept(money);
    }
}

3.1.3 Supplier<T> 接口

代码例子:

package main.java.com.ningzhaosheng.lambada.demo;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

/**
 * @author ningzhaosheng
 * @date 2024/6/27 18:03:18
 * @description Supplier 接口测试例子
 */
public class TestSupplier {

    public static void main(String[] args) {
        List<Integer> list = getNumList(10, () -> (int) (Math.random() * 100));
        for (Integer num : list) {
            System.out.println("随机数:" + num);
        }
    }

    public static List<Integer> getNumList(int num, Supplier<Integer> supplier) {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < num; i++) {
            Integer n = supplier.get();
            list.add(n);
        }
        return list;
    }
}

3.1.4 Function<T, R> 接口

代码例子:

package main.java.com.ningzhaosheng.lambada.demo;

import java.util.function.Function;

/**
 * @author ningzhaosheng
 * @date 2024/6/27 18:10:01
 * @description Function 接口测试例子
 */
public class TestFunction {

    public static void main(String[] args) {
        String trimStr = stringHandler("\t\t\t hello,你好啊,升哥!",(str)->str.trim());
        System.out.println("字符串去掉空格==========="+trimStr);

        String newStr = stringHandler("桃子姑娘是一个很漂亮的姑娘,我们青梅竹马,两小无猜,我很喜欢桃子姑娘!",(str)->str.substring(26));
        System.out.println("截取字符串==========="+newStr);
    }

    public static String stringHandler(String str, Function<String,String> function){
         return function.apply(str);
    }
}

3.1.5 Predicate<T> 接口

代码例子:

package main.java.com.ningzhaosheng.lambada.demo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * @author ningzhaosheng
 * @date 2024/6/27 18:21:37
 * @description Predicate 接口测试例子
 */
public class TestPredicate {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("Hello", "你好啊,升哥", "HashMap", "Python", "JDK8", "Map", "List", "Set", "Collection");
        List<String> stringList = filterStr(list, (str) -> str.length() > 5);
        for (String string : stringList) {
            System.out.println("打印满足条件的字符串=========" + string);
        }
    }

    public static List<String> filterStr(List<String> strings, Predicate<String> predicate) {
        List<String> stringList = new ArrayList<String>();
        for (String str : strings) {
            if (predicate.test(str))
                stringList.add(str);
        }
        return stringList;
    }
}

四、Lambda的引用

4.1 概述

当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用! 方法引用:使用操作符 “ :: ” 将方法名和对象或类的名字分隔开来。

如下三种主要使用情况 :

  • 对象 :: 实例方法
  • 类 :: 静态方法
  • 类 :: 实例方法

可以将方法引用理解为 Lambda 表达式的另外一种表现形式,方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致!

4.2 方法的引用

4.2.1 对象::实例方法

代码例子一:

package main.java.com.ningzhaosheng.lambada.demo1.method;

import java.io.PrintStream;
import java.util.function.Consumer;

/**
 * @author ningzhaosheng
 * @date 2024/6/28 10:03:20
 * @description 测试对象::实例方法引用
 */
public class TestObjectAndInstanceMethod {
    public static void main(String[] args) {
        Consumer<String> con1 = (str)->System.out.println(str);
        con1.accept("Hello World!");
        PrintStream ps = System.out;
        Consumer<String> con2 = ps::println;
        con2.accept("Hello Java8!");
        Consumer<String> con3 = System.out::println;
        con3.accept("Hello Lambada!");
    }
}

代码例子二:

package main.java.com.ningzhaosheng.lambada.demo1.method;

import main.java.com.ningzhaosheng.lambada.demo1.Employee;

import java.util.function.Supplier;

/**
 * @author ningzhaosheng
 * @date 2024/6/28 10:13:54
 * @description 测试对象::实例方法引用
 */
public class TestObjectAndInstanceMethod1 {

    public static void main(String[] args) {
        Employee em = new Employee();
        em.setAge(20);
        em.setName("张三");
        Supplier<? extends String> supplier = ()->em.getName();
        String str =  supplier.get();
        System.out.println(str);
        Supplier<Integer> supplier1 = em::getAge;
        Integer age = supplier1.get();
        System.out.println(age);
    }
}

4.2.2 类::静态方法

代码例子:

package main.java.com.ningzhaosheng.lambada.demo1.method;

import java.util.Comparator;

/**
 * @author ningzhaosheng
 * @date 2024/6/28 10:28:20
 * @description 测试类::静态方法引用
 */
public class TestClassAndStaticMethod {
    public static void main(String[] args) {
        Comparator<Integer> comparator = (x,y)->Integer.compare(x,y);
        System.out.println(comparator.compare(10,20));

        Comparator<Integer> comparator1 = Integer::compare;
        System.out.println(comparator1.compare(100,300));
    }
}

4.2.3 类::实例方法

代码例子:

package main.java.com.ningzhaosheng.lambada.demo1.method;

import java.util.function.BiPredicate;

/**
 * @author ningzhaosheng
 * @date 2024/6/28 10:34:11
 * @description 测试类::实例方法引用
 */
public class TestClassAndInstanceMethod {
    public static void main(String[] args) {
        BiPredicate<String,String> bp1 = (str1,str2)->str1.equals(str2);
        System.out.println(bp1.test("Hello","hello"));

        BiPredicate<String,String> bp2 = String::equals;
        System.out.println(bp2.test("Java","Java"));
    }
}

4.3 构造器的引用

代码例子:

package main.java.com.ningzhaosheng.lambada.demo1.construct;

import main.java.com.ningzhaosheng.lambada.demo1.Employee;

import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * @author ningzhaosheng
 * @date 2024/6/28 10:44:03
 * @description 测试构造器引用
 */
public class TestConstruct {
    public static void main(String[] args) {
        // 无参构造
        Supplier<Employee> supplier = () -> new Employee();
        System.out.println(supplier.get());

        // 无参构造
        Supplier<Employee> supplier1 = Employee::new;
        System.out.println(supplier1.get());

        // 一个参数构造
        Function<Integer, Employee> function = Employee::new;
        Employee employee = function.apply(1001);
        System.out.println(employee.toString());

        // 两个参数构造
        BiFunction<Integer, String, Employee> biFunction = Employee::new;
        Employee employee1 = biFunction.apply(1001, "张三");
        System.out.println(employee1.toString());
    }

}

4.4 数组的引用

代码例子:

package main.java.com.ningzhaosheng.lambada.demo1.array;

import java.util.function.Function;

/**
 * @author ningzhaosheng
 * @date 2024/6/28 10:55:26
 * @description 测试数组引用
 */
public class TestArray {
    public static void main(String[] args) {
        Function<Integer,String[]> function = (x)->new String[x];
        String[] strings = function.apply(10);
        System.out.println(strings.length);

        Function<Integer,String[]> function1 = String[]::new;
        String[] strings1 = function1.apply(50);
        System.out.println(strings1.length);
    }
}

五、Lambda的使用场景

通过使用Lambda表达式,我们可以写出更简洁、易读的代码,提高代码的可维护性和开发效率。下面列举一下它的使用场景。

5.1 简化编程

使用lambda表达式可以简化代码,避免定义一大堆小方法。

5.2 函数式接口

只包含一个抽象方法的接口称为函数式接口。这些接口可以使用lambda表达式。

例如:

Runnable r = () -> System.out.println("Hello, World!");
new Thread(r).start();

5.3 事件处理

在Java GUI编程中,lambda表达式经常用于按钮点击等事件的处理。

例如:

JButton button = new JButton("Click Me");
button.addActionListener(event -> System.out.println("Button clicked!"));

5.4 并行处理

Java 8的流(Stream)库使用lambda表达式来进行并行处理。

例如:

package main.java.com.ningzhaosheng.lambada.demo2;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

/**
 * @author ningzhaosheng
 * @date 2024/7/2 9:52:30
 * @description 测试Java8 lambda stream
 */
public class TestLambdaStream {
    public static void main(String[] args) {

        // 创建一个包含一百万个随机整数的列表
        List<Integer> numbers = new ArrayList<>();
        for (int i = 0; i < 100000; i++) {
            numbers.add(ThreadLocalRandom.current().nextInt(199));
        }
        //顺序流的处理
        long startTimeSeq = System.currentTimeMillis();
        double averageSequential = numbers.stream()
                .mapToInt(Integer::intValue)
                .average()
                .getAsDouble();
        long endTimeSeq = System.currentTimeMillis();
        System.out.println("sequential Average:" + averageSequential);

        System.out.println("Time taken (Sequential): " + (endTimeSeq - startTimeSeq) + "ms");

        //并行流的处理
        long startTimePar = System.currentTimeMillis();
        double averageParallel = numbers.parallelStream()
                .mapToInt(Integer::intValue)
                .average()
                .getAsDouble();

        long endTimePar = System.currentTimeMillis();

        System.out.println("parallel Average: " + averageParallel);

        System.out.println("Time taken (Parallel): " + (endTimePar - startTimePar) + "ms");

    }
}

可以看出,顺序流和并行流得到了相同的平均值,但并行流的处理时间明显少于顺序流。因为并行流能够将任务拆分成多个小任务,并在多个处理器核心上同时执行这些任务。

当然并行流也有缺点:

  • 对于较小的数据集,可能并行流更慢
  • 数据处理本身的开销较大,比如复杂计算、大量IO操作、网络通信等,可能并行流更慢
  • 可能引发线程安全问题

好了,本次内容就分享到这,欢迎关注本博主。如果有帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

启航IT世界:高考后假期的科技探索之旅

随着高考的落幕&#xff0c;新世界的大门已经为你们敞开。这个假期&#xff0c;不仅是放松身心的时光&#xff0c;更是为即将到来的IT学习之旅打下坚实基础的黄金时期。以下是一份专为你们准备的IT专业入门预习指南&#xff0c;希望能助你们一臂之力。 一&#xff1a;筑基篇&a…

(18)GPS/指南针(一)

文章目录 前言 1 GPS/指南针 2 RTK GPS 3 GPS驱动程序选项 4 GPS自动切换 5 高级用途 前言 Copter/Plane/Rover 支持与 GPS、指南针和其他定位技术的整合&#xff1a; 1 GPS/指南针 Avionics Anonymous GNSS CompassAvionics Anonymous CompassBeitain BN-220 GPS / B…

昇思MindSpore学习入门-模型训练

模型训练 模型训练一般分为四个步骤&#xff1a; 构建数据集。定义神经网络模型。定义超参、损失函数及优化器。输入数据集进行训练与评估。 现在我们有了数据集和模型后&#xff0c;可以进行模型的训练与评估。 构建数据集 首先从数据集 Dataset加载代码&#xff0c;构建…

RT-Thread Studio与CubeMX联合编程之rtthread stm32h743的使用(十一)spi设备SFUD驱动的使用

我们要在rtthread studio 开发环境中建立stm32h743xih6芯片的工程。我们使用一块stm32h743及fpga的核心板完成相关实验&#xff0c;核心板如图&#xff1a; 1.建立新工程&#xff0c;选择相应的芯片型号及debug引脚及调试器 2.编译下载&#xff0c;可以看到串口打印正常 3.…

超实用的80个网络基础知识!(非常详细)零基础入门到精通,收藏这一篇就够了

点击上方 网络技术干货圈&#xff0c;选择 设为星标 优质文章&#xff0c;及时送达 转载请注明以下内容&#xff1a; 来源&#xff1a;公众号【网络技术干货圈】 作者&#xff1a;圈圈 ID&#xff1a;wljsghq 基础网络概念 1. 网络基础概述 什么是计算机网络 计算机网络是一…

全自动封箱机:如何助力企业实现智能化升级

在飞速发展的工业自动化时代&#xff0c;全自动封箱机以其高效、精准、稳定的特点&#xff0c;成为了生产线上的不可或缺的一员。它不仅大大地提高了生产效率&#xff0c;降低了人工成本&#xff0c;更在产品质量控制、安全性等方面发挥了重要作用。星派将深入探讨全自动封箱机…

基于SpringBoot民宿管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

华为云物联网的使用

这里我们设置三个属性 1.温度DHT11_T 上传 2.湿度DHT11_H 上传 3.风扇motor 远程控制&#xff08;云平台控制设备端&#xff09; 发布主题&#xff1a; $oc/devices/{device_id}/sys/properties/report 发布主题时&#xff0c;需要上传数据&#xff0c;这个数据格式是JSON格式…

充气膜羽毛球馆投资需要多少钱—轻空间

充气膜羽毛球馆是一种现代化的运动设施&#xff0c;以其灵活的结构设计和高效的能耗管理受到广泛关注。投资建设一个充气膜羽毛球馆&#xff0c;涉及多个方面的成本&#xff0c;包括基础建设、膜材选择、系统配置以及运营维护费用。轻空间将详细分析投资建设充气膜羽毛球馆的成…

【C++知识点总结全系列 (06)】:STL六大组件详细介绍与总结(配置器、容器、迭代器、适配器、算法、仿函数)

STL六大组件目录 前言1、配置器(1)What(2)Why(3)HowA.调用new和delete实现内存分配与销毁B.STL Allocator (4)allocator类A.WhatB.HowC.allocator的算法 2、容器(1)What(2)Which&#xff08;有哪些容器&#xff09;(3)序列容器&#xff08;顺序容器&#xff09;A.WhichB.array&…

Langchain-Chatchat本地部署记录,三分钟学会!

1.前言&#xff1a; 最近AI爆发式的火&#xff0c;忆往昔尤记得16,17那会移动互联网是特别火热的&#xff0c;也造富了一批公司和个人&#xff0c;出来了很多精妙的app应用。现在轮到AI发力了&#xff0c;想想自己也应该参与到这场时代的浪潮之中&#xff0c;所以就找了开源的…

【微服务网关——https与http2代理实现】

1.https与http2代理 1.1 重新认识https与http2 https是http安全版本http2是一种传输协议两者并没有本质联系 1.1.1 https与http的区别 HTTP&#xff08;超文本传输协议&#xff09;和 HTTPS&#xff08;安全超文本传输协议&#xff09;是用于在网络上交换数据的两种协议。H…

7月刷题指南|考研数学强化30天吃透《严选题》

马上就要进入7月份了&#xff0c;相信很多小伙伴的基础阶段已经接近尾声了。特别是数二的同学们&#xff0c;应该已经完成了基础部分。而数一和数三的同学由于多了一门概率论&#xff0c;可能需要更多的时间。不管是哪种情况&#xff0c;我个人认为&#xff0c;最晚也应该在暑假…

Qt 使用代码布局,而不使用UI布局

一、工程的建立&#xff1a; 1、打开Qt Creator&#xff0c;文件&#xff0c;新建文件或项目 2、选择Application&#xff0c;Qt Widgets Application 3、写入名称&#xff0c;选择qmake 4、选择基类Base class&#xff0c;去除Generate form 务必选择QWidget&#xff0c;若…

django开源电子文档管理系统_Django简介、ORM、核心模块

Django简介 Django是一种开源的大而且全的Web应用框架&#xff0c;是由python语言来编写的。他采用了MVC模式&#xff0c;Django最初是被开发来用于管理劳伦斯出版集团下的一些以新闻为主内容的网站。一款CMS(内容管理系统)软件。并于 2005 年 7 月在 BSD 许可证下发布。这套框…

传神论文中心|第15期人工智能领域论文推荐

在人工智能领域的快速发展中&#xff0c;我们不断看到令人振奋的技术进步和创新。近期&#xff0c;开放传神&#xff08;OpenCSG&#xff09;社区发现了一些值得关注的成就。传神社区本周也为对AI和大模型感兴趣的读者们提供了一些值得一读的研究工作的简要概述以及它们各自的论…

什么是脏读、幻读、不可重复读

数据库事务 数据库事务是指作为单个逻辑工作单元执行的一系列操作&#xff0c;这些操作要么全部成功执行&#xff0c;要么全部失败回滚&#xff0c;以保持数据库的一致性和完整性。在多线程或多用户同时操作时&#xff0c;难免会出现错乱与冲突&#xff0c;这就需要引入事务的…

【C# winForm】ProgressBar进度条

1.控件介绍 进度条通常用于显示代码的执行进程进度&#xff0c;在一些复杂功能交互体验时告知用户进程还在继续。 在属性栏中&#xff0c;有三个值常用&#xff1a; Value表示当前值&#xff0c;Minimum表示进度条范围下限&#xff0c;Maximum表示进度条范围上限。 2.简单实…

【产品经理】订单处理12-订单的取消与反取消

在电商ERP系统中&#xff0c;订单取消与反取消也是常见功能之一。 订单取消与反取消也是电商ERP系统的常见功能&#xff0c;本次主要讲解下订单取消与反取消的逻辑。 一、订单取消 在电商ERP系统中&#xff0c;订单取消一般由审单员操作&#xff0c;此类取消一般是由于上下游…

商家团购app微信小程序模板

手机微信商家团购小程序页面&#xff0c;商家订餐外卖小程序前端模板下载。包含&#xff1a;团购主页、购物车订餐页面、我的订单、个人主页等。 商家团购app微信小程序模板
最新文章