Java8 新特性 之 lambda 表达 和 函数式接口

2023-11-19

—— lambda 表达式

概念

  • lambda 表达式是一个匿名函数,可以把 lambda 表达式理解为是一段可以传递的代码
  • 更简洁、更灵活,使 Java 的语言表达能力得到了提升
  • lambda 表达式是作为接口的实现类的对象(万事万物皆对象)

使用语法

  • 例:(o1,o2) -> Integer.compare(o1,o2)
  • ->:lambda 操作符 或 箭头操作符
  • -> 的左边:lambda 形参列表,对应着要重写的接口的抽象方法的形参列表
  • -> 的右边:lambda 体,对应着接口的实现类要重写的方法的方法体

语法格式

  • 无参,无返回值
        new Thread(() -> {
            System.out.println("hello");
        }).start();
  • 有一个参数,无返回值
        Consumer<Integer> a = (Integer integer) -> {
            System.out.println(integer);
        };
  • 数据类型可以省略
        Consumer<Integer> a = (integer) -> {
            System.out.println(integer);
        };
  • 只需要一个参数时,参数小括号可以省略
        Consumer<Integer> a = integer -> {
            System.out.println(integer);
        };
  • 需要两个及以上的参数,并且有返回值
        Comparator<Integer> comparator = (o1, o2) -> {
            return o1 - o2;
        };
  • 当只有一条语句时,return 和 大括号都有,则都可以省略
		Comparator<Integer> comparator = (o1, o2) -> o1 - o2;

—— 函数式接口

概念

  • 如果接口中只声明有一个抽象方法,则此接口就称为函数式接口
  • 只有给函数式接口提供实现了类的对象时,才可以使用 lambda 表达式
  • 注解:@FunctionalInterface Java8 后引入
  • 包路径:java.util.function

四大核心函数式接口

在这里插入图片描述

—— 方法引用 / 构造器引用

概念

  • 方法引用可以看做是基于 lambda 表达式的进一步刻画
  • 当需要提供一个函数式接口的实例时,我们可以使用 lambda 表达式提供此实例
    • 满足一定条件的情况下,可以使用方法引用 或 构造器引用替换 lambda 表达式
  • 方法引用作为了函数式接口的实例

使用语法

  • 格式:类(或者对象):: 方法名
  • 举例:Integer :: compare
Lists.newArrayList("a", "b", "c").forEach(System.out::println)

构造器引用

// 无参构造器
Supplier<User> userSupplier = User::new;

// 有参构造器
Function<Integer, User> userFunction = User::new;

—— Stream 流式计算

概念

  • Stream 是数据渠道,用于操作数据源(集合、数组)所生成的元素序列
  • Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤、和数据映射等操作
  • 使用 Stream API 对集合数据进行操作,类似于使用 SQL 执行的数据库查询

Stream 和 Collection 区别

  • Collection 是一种静态的内存数据结构,讲的是数据;而 Stream 是计算。前者面向内存,存储在内存中;后者面向 CPU,通过 CPU 实现计算
  • Stream 不会自己存储元素、不会改变源对象
  • Stream 操作是延迟执行。这意味着他们会等到需要结果的时候才执行。即一旦执行终止操作,这就执行中间操作链,并产生结果
  • Stream 一旦执行了终止操作,就不能再调用其他中间操作或终止操作了

操作

在这里插入图片描述

		PersonBo personBo1 = new PersonBo(1, "张三");
        PersonBo personBo2 = new PersonBo(2, "李四");
        PersonBo personBo3 = new PersonBo(3, "王五");
        PersonBo personBo4 = new PersonBo(4, "赵六");

        List<PersonBo> list = new ArrayList<>();
        list.add(personBo1);
        list.add(personBo2);
        list.add(personBo3);
        list.add(personBo4);

        // filter 过滤(返回还是对象)
        list.stream().filter(t -> {
            return t.getId() % 2 == 0;
        }).forEach(System.out::println);

        // match:anyMatch、allMatch、noneMatch 对流中的元素进行匹配
        boolean y = list.stream().anyMatch(personBo -> {
            return personBo.getName().contains("y");
        });

        // map 将集合中的元素类型,转换成另一种数据类型
        list.stream().map(PersonBo::getId).forEach(System.out::println);

        // sorted 根据字段属性进行排序
        list.stream().sorted((u1, u2) -> {
            return u2.getId().compareTo(u1.getId());
        }).map(PersonBo::getId).forEach(System.out::println);

        // limit限制数————collect将map单个映射转为list集合
        list.stream().map(t -> {
            return t.getId();
        }).limit(1).forEach(System.out::println);

        // distinct 对流中的元素进行去重
        list.stream().distinct().forEach(System.out::println);

        // partitioningBy 根据判断的值为true还是false分为两组
        Map<Boolean, List<PersonBo>> collect = list.stream().collect(Collectors.partitioningBy(personBo -> {
            return personBo.getId() > 3;
        }));

        // groupingBy 将数据分组成多个key的形式(即groupby分组)
        Map<Integer, List<PersonBo>> collect1 = list.stream().collect(Collectors.groupingBy(PersonBo::getId));

        // reduce 计算集合总数
        Integer sum = list.stream().map(PersonBo::getId).reduce(Integer::sum).get();
        System.out.println(sum);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java8 新特性 之 lambda 表达 和 函数式接口 的相关文章

  • 菜单未显示在应用程序中

    由于某种原因 我的操作菜单在我的 Android Studio 应用程序中消失了 我正在按照教程学习如何创建 Android 应用程序 但最终遇到了这个问题 我正在使用 atm 的教程 http www raywenderlich com
  • 如何在一行中将字符串数组转换为双精度数组

    我有一个字符串数组 String guaranteedOutput Arrays copyOf values values length String class 所有字符串值都是数字 数据应转换为Double QuestionJava 中
  • ElasticBeanstalk Java,Spring 活动配置文件

    我正在尝试通过 AWS ElasticBeanstalk 启动 spring boot jar 一切正常 配置文件为 默认 有谁知道如何为 java ElasticBeanstalk 应用程序 不是 tomcat 设置活动配置文件 spri
  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • manifest.mf 文件的附加内容的约定?

    Java JAR 中的 MANIFEST MF 文件是否有任何超出 MANIFEST MF 约定的约定 JAR规范 http download oracle com javase 1 4 2 docs guide jar jar html
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • CXF Swagger2功能添加安全定义

    我想使用 org apache cxf jaxrs swagger Swagger2Feature 将安全定义添加到我的其余服务中 但是我看不到任何相关方法或任何有关如何执行此操作的资源 下面是我想使用 swagger2feature 生成
  • 一种使用 Java Robot API 和 Selenium WebDriver by Java 进行文件上传的解决方案

    我看到很多人在使用 Selenium WebDriver 的测试环境中上传文件时遇到问题 我使用 selenium WebDriver 和 java 也遇到了同样的问题 我终于找到了解决方案 所以我将其发布在这里希望对其他人有所帮助 当我需
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • 运行 Jar 文件时出现问题

    我已将 java 项目编译成 Jar 文件 但运行它时遇到问题 当我跑步时 java jar myJar jar 我收到以下错误 Could not find the main class myClass 类文件不在 jar 的根目录中 因
  • Android JNI C 简单追加函数

    我想制作一个简单的函数 返回两个字符串的值 基本上 java public native String getAppendedString String name c jstring Java com example hellojni He
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item

随机推荐

  • 【每日一题】leetcode 二叉树层序遍历 - 介绍

    层序遍历 遍历顺序为 F B G A D I C E H 一层一层遍历 代码 import java util ArrayList import java util LinkedList import java util List impo
  • 《软件调试的艺术》学习笔记——GDB使用技巧摘要(1)

    软件调试的艺术 因为名是The Art of Debugging with GDB DDD and Eclipse 作者是美国的Norman Matloff和Peter Jay Salzman 中文版由张云翻译 是人邮出版社图灵程序设计丛书
  • 机器学习2-线性回归

    一 矩阵求导公式 1 总体情况 2 分子布局 Numerator layout 和分母布局 Denominator layout 首先我们常说 y 对 x 求导 这里的 y 和 x 均默认为列向量 y为 mx1 x为 nx1 1 分子布局
  • stm32—外部中断、中断和事件的区别

    目录 EXTI 简介 EXTI 框图 1 中断的线路 1 2 3 4 5 2 产生事件线路 1 2 3 6 7 8 疑惑 中断和事件的区别 1 硬件级与软件级 2 事件不一定产生中断 外部中断 事件线映射 EXTI 配置步骤 初始化函数 E
  • sklearn:卡方分布输入不能是负数

    今天使用sklearn进行特征选择的时候出现一个错误 ValueError Input X must be non negative 找了stackoverflow 原来是卡方验证不能用于负值 卡方分布是通过统计当前变量的频次 和目标变量的
  • 【程序人生】底层程序员,出局

    底层程序员 出局 不如去送外卖 这是徐亮和同事们常开的一个玩笑 入职两三个月 最初的激情退去 在加完班的夜晚 他疲惫地躺在床上 经常自嘲式地想起这个玩笑 送外卖是搬运食物 自己是搬运代码 都不产出新的东西 在深圳 每个人都走得很快 这是徐亮
  • kafka的安装和使用

    ZooKeeper简介 ZooKeeper 是一个为分布式应用所设计的分布的 开源的 java 协调服务 分布式的应用可以建立在同步配置管理 选举 分布式锁 分组和命名等服务的更高级别的实现的基础之上 ZooKeeper 意欲设计一个易于编
  • C语言(二十一)

    1 查找指定字符 本题要求编写程序 从给定字符串中查找某指定的字符 输入 输入待查找的字符c以及字符串s 输出 找到则输出字符c在字符串s中所对应的最大下标index 否则输出 Not Found 优化目标 无 include
  • TCP/IP详解 卷1:协议 学习笔记 第二十九章 网络文件系统

    NFS 网络文件系统 使客户可以透明地访问服务器上的文件和文件系统 NFS的基础是RPC 两个常用的网络编程API socket和TLI 运输层接口 Transport Layer Interface 通信的双方可使用不同的API RPC可
  • 蚁剑的使用以及用蚁剑做一道ctf题

    一 蚁剑的介绍及下载 1 蚁剑是一款和菜刀相像的shell控制端软件 主要面向于合法授权的渗透测试安全人员以及进行常规操作的网站管理员 2 蚁剑的下载 这是gethub的官方下载地址 供大家下载 3 蚁剑的安装 点击初始化就完成安装 再次点
  • Linux进程管理:deadline调度器

    一 概述 实时系统是这样的一种计算系统 当事件发生后 它必须在确定的时间范围内做出响应 在实时系统中 产生正确的结果不仅依赖于系统正确的逻辑动作 而且依赖于逻辑动作的时序 换句话说 当系统收到某个请求 会做出相应的动作以响应该请求 想要保证
  • Jib使用小结(Maven插件版)

    小结三 多次构建后 积累的无用镜像 如下所示 构建多次后 本地会遗留多个名为 tag也是的镜像 root maven hellojib docker images REPOSITORY TAG IMAGE ID CREATED SIZE b
  • 懒人式迁移服务器深度学习环境(完全不需要重新下载)

    换服务器了 想迁移原来服务器上的深度学习环境 但又觉得麻烦懒得重新安装一遍anaconda pytorch 有没有办法能不费吹灰之力直接迁移 接下来跟着我一起 懒汉式迁移 本方法适用于在同一内网下的两台服务器之间互相迁移 不在同一局域网下的
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • C++ primer智能指针(HasPtr)实现

    智能指针显然是C 吸引人的地方之一 必须掌握 看了 C primer 里面着重讲了智能指针的实现方式 书中说到 HasPtr 注 就是自定义的智能指针 在其它方面的行为与普通指针一致 具体而言 复制对象时 副本和原对象将指向同一基础对象 如
  • linux下libxml库的安装及编译

    linux下libxml库的安装及编译 1 下载和安装LIBXML2 Libxml2是个C语言的XML程式库 能简单方便的提供对XML文件的各种操作 并且支持XPATH查询 及部分的支持XSLT转换等功能 Libxml2的下载地址是 htt
  • Mysql8.0出现this is incompatible with sql_mode=only_full_group_by

    MySQL的sql mode模式说明及设置 sql mode是个很容易被忽视的变量 默认值是空值 在这种设置下是可以允许一些非法操作的 比如允许一些非法数据的插入 在生产环境必须将这个值设置为严格模式 所以开发 测试环境的数据库也必须要设置
  • phabricator mysql_搭建 Phabricator 我遇到的那些坑 - 简书

    一 可能会用到的命令 1 重启phd守护线程 先进入到Fabricator文件夹下面 然后 bin phd log 2 删除一个代码仓库 bin remove destroy rMOBILE 代码库的前缀名字 3 重启mysql数据库 su
  • 数据结构:力扣OJ题

    目录 编辑题一 链表分割 思路一 题二 相交链表 思路一 题三 环形链表 思路一 题四 链表的回文结构 思路一 链表反转 查找中间节点 本人实力有限可能对一些地方解释的不够清晰 可以自己尝试读代码 望海涵 题一 链表分割 现有一链表的头指针
  • Java8 新特性 之 lambda 表达 和 函数式接口

    lambda 表达式 概念 lambda 表达式是一个匿名函数 可以把 lambda 表达式理解为是一段可以传递的代码 更简洁 更灵活 使 Java 的语言表达能力得到了提升 lambda 表达式是作为接口的实现类的对象 万事万物皆对象 使