Lambda表达式、函数式接口

2023-11-02

一、Lambda

1.1 概述

Lambda表达式是一种没有名字的函数,也可以称为闭包,是Java8发布的最重要新特性

本质上是一段匿名内部类,也可以是一段可以传递的代码

还有的叫箭头函数

1.2 优点

是匿名内部类的简写方式,使代码更加简洁

1.3 和匿名内部类对比

String[] strs = {"1","2","123","1"};

//转换为list

List<String>strings = Arrays.asList(strs);

//匿名内部类

Collections.sort(Strings,new Comparator<String>(){

@Override

public int compare(String o1,String o2){

lnteger i1 = integer.valueOf(o1);

lnteger i2 = integer.valueOf(o2);

//升序

return i1-i2;

}

});

//箭头函数

Collections。sort(strings,(s1,s2)->{

Integer i1 = Inewger.valueOf(s1);

Integer i2 = Inewger.valueOf(s2);

//降序

return i2-i1;

});

1.4 语法结构

(参数,参数,参数...)->{方法体}

1.无参和多参,小括号必须写

2、只有一个参数的时候,小括号可以不写

3、如果只有一条语句,大括号也可以不写,并且语句结尾不需要 分号

4、如果只有一条语句,并且也是返回值的话,return也要省略

5、如果是多条语句,必须加{},

1.5 案例

String[] strs = {"12"."2","123","1"};

//转换为list

list<String>strings = Arrays.asList(strs);

//匿名内部类

Collection。sort(strings,new Comparator<String> (){

@Override

public int compare(String o1,String o2){

Integer i1 = Integer.valueOf(o1);

Integer i2= Integer.valueOf(o2);

//升序

return i1-i2;

}
});

//箭头函数

Collections.sort(Strings,(s1,s2)->{

//多条语句

Integer i1 = Integer.valueOf(s1);

Integer i2 = Integer.valueOf(s2);

//降序

return i2-i1;

});

System.out.println(strings);

Integer[] is = {1,4,5,2,3,7};

List<Integer>list = Arrays.asList(is);

//1.8之前的方法

Collections.sor(list,new Comparator<Integer>(){
@Override

public int compare(Integeer o1,integer o2){
return o2-o1;

}
});

//lambda写法

Collections.sort(list,(x,y)->x-y);

System.out.println(list);

  

二、函数式接口

2.1概述

英文称为Functional Interface

其质是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。核心目标是为了给Lambda表达式的使用提供更好的支持,进一步达到函数式编程的目标,可通过运用函数式编程极大地提高编程效率。其可以被隐式转换为 lambda 表达式。

2.2 特点

函数式接口是仅制定一个抽象方法的接口可以包含一个或多个静态或默认方法专用注解即@FunctionalInterface 检查它是否是一个函数式接口,也可不添加该注解如果有两个或以上 抽象方法,就不能当成函数式接口去使用,也不能添加@FunctionalInterface这个注解如果只有一个抽象方法,那么@FunctionalInterface注解 加不加 都可以当做函数式接口去使用

2.3 自定义


public class Function {
    public static void main(String[] args) {
        //子实现类的写法
        Test test = new Test();
        m1(test);
        //匿名内部类
        m1(new MyFunction() {
            
            @Override
            public void print() {
                System.out.println("匿名内部类写法");
                
            }
        });
        //lambda写法
        m1(()->System.out.println("lambda表达式写法"));
    }
 public static void m1(MyFunction function){
     function.print();
 }
}
//可以加也可以不加
//函数式接口中,只允许出现一个抽象方法,和N个非抽象方法
@FunctionalInterface
interface MyFunction{
    public void print();
}
class Test implements MyFunction{

    @Override
    public void print() {
        System.out.println("我是Test实现类");
        
    }
    
}

2.4 JDk自带的函数式接口

supplier:表示供应商,有个get方法,无参,有返回值,一般用于获取数据

Consumer:表示消费者,accpet,有参,无返回值

Function:函数操作 ,apply,有参也有返回值

Predicate:断言,用于做判断校验操作,test,需要传入参数并返回boolean类型

3、 方法、构造器、数组

3.1 概述

Lambda表达式的另一种形式

3.2 方法引用


import java.util.function.Supplier;

//对象引用
public class FunCall_01 {
public static void main(String[] args) {
    Integer i1 = 12;
    Supplier<String>supplier = i1::toString;
    System.out.println(supplier.get());
    System.out.println(i1.toString());
    
}
}
 


import java.util.function.Function;

//类名::静态方法名
public class FunCall_02 {
public static void main(String[] args) {
    String string ="123";
    Function<String, Integer>function = Integer::parseInt;
    int value = function.apply(string);
    System.out.println(value);
}
}


import java.util.function.BiPredicate;

//类名::成员方法名
public class FunCall_03 {
public static void main(String[] args) {
    BiPredicate<String, String>predicate = String::equals;
    System.out.println(predicate.test("a", new String("a")));
}
}
 

3.3 构造器引用


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


//构造方法
public class FunCall_04 {
public static void main(String[] args) {
    //无参构造
    Supplier<Object>s1 = Object::new;
    System.out.println(s1.get());
    //有参构造
    Function<String, String>f1 = String::new;
    System.out.println(f1.apply("zxc"));
}
}

3.4 数组引用


import java.util.function.Function;

//数组调用
public class FunCall_05 {
public static void main(String[] args) {
    //泛型第一个是长度,第二个是返回值
    Function<Integer, Integer[]>fun = Integer[]::new;
    Integer[] arr = fun.apply(4);
    for (Integer integer : arr) {
        System.out.println(integer);        
    }
}
}
 

4、 Stream API

4.1 概述

数据渠道、管道,用于操作数据源(集合、数组等)所生成的元素序列

集合讲的是数据,流讲的是计算

即一组用来处理数组,集合的API

4.2 特点

Stream 不是数据结构,没有内部存储,自己不会储存元素

Stream不会改变源对象,相反,他们会返回一个持有结果的新Stream,

Strem操作是延迟执行的,这意味着他们会等到需要结果的时候才会执行

不支持索引访问

延迟计算

支持并行

很容易生成数据或集合

支持过滤,查找,转换,汇总,聚合等操作

4.3应用场景

流式计算处理,需要延迟计算、更方便的并行计算

更灵活、简洁的集合处理方式场景

4.4 创建流的五种方式


import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;

//流的创建
public class Stream_01 {
public static void main(String[] args) {
    // 数组,Stream.of
    String[] strings = {"a","b","c","d"};
    Stream<String>stream1 = Stream.of(strings);
    //通过集合
    List<String>strings2 = Arrays.asList(strings);
    Stream<String>stream2 = strings2.stream();
    //通过Stream.generate来创建
    //创建一个无限流,里面全是1,并且通过limit限制条数是5条
    Stream<Integer>generate = Stream.generate(()->1);
    generate.limit(5).forEach(x->System.out.print(x));
    //通过已有API
    String string = "abc";
    IntStream chars = string.chars();
    chars.forEach(x->System.out.println(x));
    
}
}

4.5 转换算子

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/*转换算子,又称为 中间操作,所以的转换算子得到的都是
 * 一个新的流,所以一般用于链式调用
 * 常用的转换算子
 * limit : 取集合中的前几条数据
 * filter :对元素进行过滤筛选,不符合条件的就不要
 * distinct :去除重复
 * skip:跳过
 * map:更改数据
 * sorted:排序
 * 注意:只有转换算子,是不执行的,必须执行动作才会真正执行
 * ·
 */
public class Stream_02 {
    public static void main(String[] args) {
        List<String>strings = Arrays.asList("a","b","c","a");
        //只有a
        Stream<String>stream = strings.stream();
        //collect动作算子,把流中的数据转换为集合
        //filter不符合条件的就不要了,返回false就是不要,true就是要
        List<String>value = stream.filter(x->x.equals("a")).collect(Collectors.toList());
        System.out.println(value);
        //不要偶数
        List<Integer>integers = Arrays.asList(1,3,5,7,9,11,444,257);
        Stream<Integer>stream1 = integers.stream();
        List<Integer>value2 = stream1.filter(x->x%2==1).collect(Collectors.toList());
        System.out.println(value2);
        //skip:跳过元素
        stream1 = integers.stream();
        value2 = stream1.skip(2).collect(Collectors.toList());
        System.out.println(value2);
        //distinct:去重
        stream = strings.stream();
        value = stream.distinct().collect(Collectors.toList());
        System.out.println(value);
        //map:遍历过程中对元素进行·操作,比如涨薪
        List<Double>sal = Arrays.asList(1152.2,2000.5,8888.8);
        Stream<Double>salStream = sal.stream();
        List<Double>newSal = salStream.map(x->x*10).collect(Collectors.toList());
        System.out.println(newSal);
        
        //limit前几条,比如查看前两名
        salStream = sal.stream();
        //sorted进行排序y-x是降序,x-y是升序
        newSal = salStream.sorted((x,y)->{
            if(y>x){
                return 1;
            }else if (y == x) {
                return 0;
            }else{
                return -1;
            }
        }).limit(2).collect(Collectors.toList());
        System.out.println(newSal);
        
        
    }

}

4.6 动作算子


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/*常用的动作算子
* forEach:循环
* 计算:min,max,count
* 收集器:collect
*/
public class Stream_03 {
    public static void main(String[] args) {
        List<String> strings = Arrays.asList("a", "b", "c", "a", "b", "c", "a",
                "b", "c");
        Stream<String> stream = strings.stream();
        // forEach
        stream.forEach(x -> System.out.println(x));

        // 计数 count
        stream = strings.stream();
        long count = stream.filter(x->x.equals("a")).count();
        System.out.println(count);
        
        // max 获取最大值  min 最小值
        List<Integer> integers = Arrays.asList(1,2,3,4,5);
        Stream<Integer> integerStream = integers.stream();
        Integer i1 = integerStream.max((x,y)->x-y).get();
        System.out.println(i1);
        
        // anyMatch 匹配数据,比如是否包含
        integerStream = integers.stream();
        boolean flag = integerStream.anyMatch(x->x==5);
        System.out.println(flag);
        // 当然这种是否包含可以使用contains解决,但是有的是contains解决不了的
        System.out.println(integers.contains(5));
        
        // 比如 所有的用户中 是否有19岁的
        List<User> users = new ArrayList<User>();
        users.add(new User("a", 18));
        users.add(new User("b", 19));
        users.add(new User("c", 20));
        Stream<User> userStream = users.stream();
        flag = userStream.anyMatch(u->u.age==19);
        System.out.println(flag);
    }
}
class User{
    String name;
    int age;
    public User(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
}

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

Lambda表达式、函数式接口 的相关文章

  • Java类和对象的练习题

    1 冒泡排序 package one 使用冒泡排序 实现如下的数组从小到大排序 int arr new int 34 5 22 98 6 76 0 3 public class pao public static void main Str
  • 【转】计算机网络——三次握手与四次挥手

    转载来源 网络编程知识预备 2 三次握手与四次挥手 流量控制 滑动窗口 拥塞控制 半连接状态 2MSL 目录 一 三次握手 什么是三次握手 三次握手图解 过程解析 1 第一次握手 2 第二次握手 3 第三次握手 二 四次挥手 什么是四次挥手
  • 关于电脑找不到vcruntime140_1.dll,无法继续执行代码的解决方案-这几种解决方法轻松解决

    vcruntime140 1 dll文件是Windows操作系统中必要的动态链接库文件之一 当出现错误提示 vcruntime140 1 dll文件未找到 或 vcruntime140 1 dll已丢失 时 就需要对该问题进行解决 以下是一
  • springboot读写json文件,格式化写入json,java

    java springboot读写json文件 这是一个很酷的动作 而且是格式化写入json 美观漂亮 有问题可以咨询我的微信yizheng369 源码地址 https gitee com 618859 java springboot up
  • 属性重要性的举例(定性数据聚类)

    近日在解决一组定性数据的聚类问题 看文献时觉得论文中 基于属性重要性的定性数据聚类方法 举例不太容易理解 尤其是对我这种不喜欢看数学公式的人 所以写了这篇以备忘 1 基础知识 粗糙集和等价关系可参考 https blog csdn net
  • JAVAのIO框架---commons-io

    commons io包下载地址 Commons IO Download Apache Commons IO 进入后点击第二个链接下载 解压完后 箭头所指就是我们这次要用的jar包了 复制它 进入idea 导入jar包最关键的一步来了 右键粘
  • 3.【多级缓存架构】数据库和缓存不一致的情况分析和解决方案

    3 多级缓存架构 数据库和缓存不一致的情况分析和解决方案 文章目录 3 多级缓存架构 数据库和缓存不一致的情况分析和解决方案 1 最初级的缓存不一致的问题以及解决方案 1 1 问题 先修改数据库 在删除缓存 如果删除缓存失败了 就会导致数据
  • 基于express的文件上传功能实现

    基于express 的文件上传功能 功能描述 可以上传文件 并在后台中看到上传的文件 可以上传图片 并进行一个简单预览 点击提交后可以在后台中看到 功能展示 功能实现 index html
  • 爬虫实例分析

    下面我将介绍如何一步一步将豆瓣的top250的网页数据爬取并保存在本地 首先我们需要python的基础 定义变量 列表 字典 元组 if语句 while语句等 然后利用了解爬虫的基本框架 原理 爬虫就是模仿浏览器去访问网络中的网页 并将网页
  • 我心目中的优秀开发人员标准 兼谈OO和设计模式

    看了包建强的blog 一个优秀 NET程序员的技能树 想说些个人意见 包建强所列举的技能很多 可以说绝大部分人都达不到他说的标准 难道达不到那个标准就算不上优秀了 也不尽然 每个人有自己的看法 我的看法 对于 net方面的开发人员 我认为应
  • 你与高薪offer的距离是否还差这一份985页Java面经?

    前言 现在已经九月底 金九银十也已经过去了一大半 很明显今年的面试季明显不如往年火热 对于求职者来说 也更难了一些 马上迎来国庆节 假期一过 十月份又过去了三分之一 综合来看今年确实不是面试的最佳时期 不过趁今年所剩的时间来好好准备 明年的
  • 统计学-基于R (第四版) 贾俊平编著 第一章:数据与R语言 习题答案 【自用】

    习题1 1 1 这题没写存储 只写了录入 wagelevels lt c 低收入户 中等偏下户 中等收入户 中等偏上户 高收入户 yr2016 lt c 3750 7338 10508 14823 28225 yr2017 lt c 464
  • 使用phpmyadmin遇到问题“Warning in ./libraries/sql.lib.php#613 count()

    在安装好phpmyadmin后遇到问题 Warning in libraries sql lib php 613 count Parameter must be an array or an object that implements C
  • 如何在VMware上安装CentOS7?

    目录 一 器材准备 二 创建一个虚拟机 三 安装Centos7系统 一 器材准备 1 Centos7及以上版本的iso镜像 链接 centos7镜像 提取码 ao3n 2 VMware15及以上版本的软件工具包 链接 VMware16安装包
  • 并行运算出现“_pickle.PicklingError: Can‘t pickle <function calculate at 0x000001ADE8C2EEE0>”

    尝试将需要并行运算的函数同并行运算结构体分开进行并行运算 例 创建一个名为calculate py的新文件 并将以下代码粘贴到该文件中 def calculate num return num 2 主程序的代码如下 import multi
  • 如何优化代码中大量的if/else,switch/case?

    前言 随着项目的迭代 代码中存在的分支判断可能会越来越多 当里面涉及到的逻辑比较复杂或者分支数量实在是多的难以维护的时候 我们就要考虑下 有办法能让这些代码变得更优雅吗 正文 使用枚举 这里我们简单的定义一个表示状态的枚举 public e
  • qq的Tencent://Message/协议

    QQ即时聊天代码 为QQ号码 以前这样写 http wpa qq com msgrd V 1 Uin Site hexun com ngdao Menu yes 现在这样写 tencent message uin Site hexun co
  • upload-master-pass8

    第八关 又是黑名单绕过 但是没有处理 DATA 引用某位大佬的解释就是 php在window的时候如果文件名 DATA 会把 DATA之后的数据当成文件流处理 不会检测后缀名 且保持 DATA 之前的文件名 他的目的就是不检查后缀名 验证
  • ASCII、Unicode、UTF-8、GBK、全角/半角

    入门小菜鸟 希望像做笔记记录自己学的东西 也希望能帮助到同样入门的人 更希望大佬们帮忙纠错啦 侵权立删 目录 一 定义 1 ASCII 2 Unicode 3 UTF 8 4 GB2312 5 GBK 6 u和 x 7 全角和半角 二 相互
  • 【IEDA】ERROR!

    一 中文乱码 public class litera public static void main String args 整数 System out println 100 小数 System out println 0 01 字符 S

随机推荐

  • LINUX DRM 入门一条龙

    使用nanopiM3 s5p6818 LINUX 内核4 4 172 使用HDMI接口显示图像 源码 usb2hdmi 使用usb传输FB数据 hdmi接口输出 情景分析法 使用modetest命令作为应用层的测试例程 modetest M
  • 28黑马QT笔记之QPixmap保存图片

    28黑马QT笔记之QPixmap保存图片 1 QPixmap QImage QPictrue三种绘图工具之间的区别 上一篇我们讲到QPixmap如何在窗口进行绘图 接下来本篇要讲的是QPixmap如何保存一张图片 即将已有图片再按自己方式保
  • 线性代数的本质——线性组合,张成空间和基

    本文是对BiliBili上的一个系列视频的学习记录 非常推荐大家去B站上观看 记得三连 不要白嫖 链接 https www bilibili com video av6731067 p 2 上文中说到 向量坐标中的数字 可视为对基向量的拉伸
  • TypeError: ‘DataContainer‘ object is not iterable解决

    mmsegmentation训练的过程中eval时报错 环境如下 sys platform linux Python 3 8 13 default Mar 28 2022 11 38 47 GCC 7 5 0 CUDA available
  • php assert执行命令,代码执行&命令执行&命令注入

    代码执行 命令执行 命令注入 代码执行 代码执行是靠脚本代码调用操作系统的命令 eval eval string code mixed 把字符串 code 作为PHP代码执行 eval POST c 直接蚁剑链接密码为c 中国菜刀 ckni
  • mapbox-gl图形绘制并编辑已有图层

    文章目录 前言 1 react中使用mapbox gl draw绘制 2 已有图层编辑 3 绘图控件的控制 4 数据缓存造成的一个bug 问题描述 原因 解决方案 总结 前言 相信经常和地理数据打交道的小伙伴都有过标绘地理数据的经历 使用A
  • 窗口子类化和超类化

    目录 窗口子类化 窗口超类化 窗口子类化 窗口子类化的目的是在不修改现有代码的前提下 扩展现有窗口 控件的功能 它的思路很简单 就是将窗口过程地址修改为一个新函数地址 新的窗口过程函数处理自己感兴趣的消息 将不感兴趣的消息丢给原窗口过程处理
  • 11、Iterable迭代

    3 6 Iterator es6新特性 使用iterator来遍历迭代数组 map set 遍历数组 通过for of for in 下标 var arr 3 4 5 for var x of arr console log x 遍历map
  • Python中字符串转义字符的用法----退格符\b

    鄙人第一次写博客 如果有错误 或者表达不当的 希望有大佬们多多指点 我将不甚感激 退格符 b b代表backspace 平时电脑使用这个键就是删除 可以把一个退格符看成一个backspace键 他的原理相当于把一个字符删去 用后面的字符代替
  • 第二章 索引-练习题

    第二章 索引 练习题 首先要导入对应的模块 import pandas as pd import numpy as np Ex1 公司员工数据集 现有一份公司员工数据集 df pd read csv data company csv df
  • 为什么苹果蓝牙耳机连上还是公放_如何测试蓝牙设备的延时

    蓝牙设备的延时准确测量很复杂 但是这里有个小工具 自己动手就可以做 数据一出胜过嘴炮 1 首先去下载安装superpowered latency ios 安卓版的都有 Test iOS and Android Audio Latency w
  • Javafx集成sqlite数据库

    什么是SQLite SQLite是一款非常轻量级的关系数据库系统 支持多数SQL92标准 SQLite在使用前不需要安装设置 不需要进程来启动 停止或配置 而其他大多数SQL数据库引擎是作为一个单独的服务器进程 被程序使用某种内部进程通信
  • input输入子系统分析

    input输入子系统分析 input子系统学习 总体框架分析 从事件处理过程 程序 看input子系统 对设备驱动层的分析 对事件处理层的分析 对核心处理层 input c 的分析 input子系统学习 Input子系统作为linux下很重
  • 静态代码分析工具清单:开源篇

    http hao jobbole com static code analysis tool list opensource lang utm source blog jobbole com utm medium sidebar resou
  • SaaS 系统完全开源介绍

    平台简介 芋道 以开发者为中心 打造中国第一流的快速开发平台 全部开源 个人与企业可 100 免费使用 架构图 管理后台的 Vue3 版本采用 vue element plus admin Vue2 版本采用 vue element adm
  • 为什么延时函数while()没有递减

    因为有时钟中断 1ms中断一次 如何减1
  • 【java】mybatis-plus lambda表达式符号总结

    1 函数名及用法 查询学生 QueryWrapper
  • 基于java的俄罗斯方块小游戏设计(含源文件)

    欢迎添加微信互相交流学习哦 项目源码 https gitee com oklongmm biye 题 目 小游戏开发 摘 要 俄罗斯方块是我们最常见的游戏之一 该游戏出现过在掌上游戏机 家用游戏机 手机游戏和电脑游戏中 因此俄罗斯方块也是一
  • TencentOS-tiny 内核基础组件(十 七)- 环形队列

    一 内核基础组件 环形队列 概述 环形队列本质上就是支持先入先出操作的环形buffer 是系统的一个基础组件 通常用来作为实现上层机制的底层数据容器 API讲解 编程实例 1 编写main c示例代码 USER CODE END Heade
  • Lambda表达式、函数式接口

    一 Lambda 1 1 概述 Lambda表达式是一种没有名字的函数 也可以称为闭包 是Java8发布的最重要新特性 本质上是一段匿名内部类 也可以是一段可以传递的代码 还有的叫箭头函数 1 2 优点 是匿名内部类的简写方式 使代码更加简