第十四章 Iambda表达式和流处理

news2024/11/7 15:24:28

 第十四章  Iambda表达式和流处理

 14.1:Iambda表达式简介

 Iambda表达式可以用非常少的代码来实现抽象方法。 Iambda表达式不能独立执行,因此必须是西安函数式接口,并返回一个函数式接口的对象。 Iambda表达式的语法特殊的  语法格式如下

()->结果表达式
参数 ->结果表达式
(参数1,参数2, ....参数n)->结果表达式
//  ()      ->     {代码块}
//   这个方法   按照   这样的代码来实现
//简单总结:操作左侧的式方法残念书,操作符右侧是方法体
 Iambda表达式实现函数式接口

 Iambda表达式可以实现函数式接口,

1.函数式接口

函数式接口的式京包含的一个抽象方法的接口,接口中的方法简单明了地说明了接口地,如用途线程解耦Runnable,动作时间监听接口,ActionListener等,开发者可以创建自定义地函数式接口  如下

interface Mylnterface{
    void method();
}
//定义了一个没有方法体的抽象方法 
2. Iambda表达式实现无参数抽象方法

很多函数接口的抽放方法是无参数的,如线程接口Runnable接口只有一个run()方法这样的无参抽象方法在 Iambda表达式中使用()表示代码如

本实例,直接在 Iambda表达式中创建了SayHiInterface接口对象,并制定了一个字符串作为接口方法的返回值,最后在输出语句中,pi对象就是Iambda表达式创建出的对象,当pi调用接口方法时就输出了 Iambda表达式指定的字符串

3.Iambda表达式实现也有参的抽象方法

代码如下

在这实例中,函数式接口的抽象方法有两个参数,Iambda表达式的圆括号内也写了两个参数对应的抽象方法,注意 Iambda表达式中的参数不需要与抽象方法的参数名称相同,但是顺序必须相同

4.Iambda表达式使用代码块

当函数式接口的抽象方法需要实现复杂的逻辑而不是返回一个简单的表达式的话 ,就需要在Iambda表达式中使用代码块  Iambda表达式会自动判断返回类型释放符合抽象方法的定义

代码如下

Iambda表达式调用外部变量

Iambda表达式除了可以调用定义好的参数,还可以调用表达式以外的变量,但是,这些外部变量有些可以被更改 有些则不行

1.Iambda表达式无法更改局部变量

局部变量在lambda表达式中默认被定义为final(静态)也就是说Iambda表啊但是只能调用局部变量,却不能改变其值  代码如下

package 第十四章;
interface Variablelnterface1{
    void method();
}
 
public class VariableDemo1 {
    public static void main (String []args) {
        int value = 100;
        Variablelnterface1 v =()->{
            int num = value-90;
            value = 12;
        };
    }
}
2.lambda表达式可以更改成员变量

成元年两式在lambda表达式中不是被final修饰的,所以lambda表达式可以改变其值

例题如下

package 第十四章;
interface Variableinterface1{//创建接口
    void method();//测试方法
}
public class VariableDemo2 {//测试类
    int  value =100;//创建类的成员变量
    public void action () {//创建类的成员方法
        Variableinterface1 v =() ->{//实现接口
            value = -12;//更改成员变量,没提示任何错误
        };
        System.out.print("运行接口方法钱value"+value);//运行接口方法钱先输出成员变量值
        v.method();//运行接口方法
        System.out.print("运行接口方法后value"+value);//运行接口方法后在输出成员变量值
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        VariableDemo2 demo=new VariableDemo2();//创建测试类对象
        demo.action();//调用测试类方法
    }
}

lambda表达式与异常处理

很多接口的抽象方法为了保证程序的安全性,会在定义时抛出异常,但是lambda表达式中并没有抛出异常的语法,这是因为lambda表达式会默认抛出抽象原有的异常每当此方法被调用时则需要进行异常处理

14.2方法的引用

lambda表达式还添加了一类新语法,用来一弄方法也就是方法可以作为一个对象被调用,根据不同的方法类型,方法的引用包括了引用静态方法,引用成员方法和引用构造方法等等。

引用语法如下

类名::静态方法名  //“::”是引用的意思
主要的使用方法如下

package 第十四章;
 
interface AddInterface1{
    int add(int a ,int b );
}
public class paramterDemo1 {
    static int add (int a , int b){//需要添加static变量(让这个方法变成静态方法  然后达到只能坐在本类使用)
        return a+b ;
    }
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //1 paramterDemo1  pd  = new paramterDemo1();//去掉static的方法
        AddInterface1 add1 = paramterDemo1::add;//使用paramterDemo1中的add方法来补全方法体然而达成效果
        System.out.println("方法的引用:"+add1.add(3, 5));
    }
 
}

 代码图如下

运行结果如下

方法的引用:8
引用成员方法

引用成员方法如下

对象名::成员方法名
跟引用静态方法不同  这个操作符左边一定要是对象名 右边不是类名。这种语法可以达到抽象方法按照抽象方法按照类成员方法逻辑来实现的目的

实际代码如下


引用带有泛型的方法

泛型是java开发经常使用到的功能 “::”操作符支持引用泛型的方法。除了方法外,“::”操作符也支持引用带有泛型的类

引用构造方法

lambda表达式有3种引用构造方法的语句,分别是引用无参构造方法,引用有参构造方法和引用数组构造方法

1.引用无参构造方法

引用无参构造方法的语句如下

类名::new
因为构造方法与与类名相同,如果操作符左右都写类名的话,会让操作符以为是在引用与类名相同的静态方法,这昂会导致程序出现Bug,所以引用构造方法的语法使用了new关键字,操作符右侧new关键字,表示引用构造方法  

这个语法有一点要注意:new关键字之后没有圆括号,也没有参数的定义。如果类中既有无参构造方法,又有有参构造方法。使用引用构造方法语句后,究竟哪一个构造方法被引用了呢,引用哪个构造方法是有函数决定的,“::”操作符会返回与抽象方法的参数结构相同的构造方法,如果找不到参数接口相同的构造方法,则会繁盛编译错误

以如下代码所示


 引用数组构造方法

java开发可能出现这样一种特殊场景:把数组类型当作泛型,如果犯法返回值为泛型,在这种特殊场景下,方法就应该是返回一个数组类型的结果,如果要求抽象方法引用构造方法,又要返回数组类型结果,这种场景下抽象方法的参数有了另外一个含义:数组个数  抽象方法的参数可以决定返回的数组长度,但是数组中的元素并不是有值的,还需要再次赋值。引用数组构造方法的语法也会有所不同 语法如下

类名[]::new
 代码如下:

package 第十四章;
interface ArraysConslnterface<T>{
    //抽象方法返回对象数组,方法参数决定了数组的个数
    T action(int n);
}
public class ArraysConsDemo {
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArraysConslnterface<ArraysConsDemo[]> a = ArraysConsDemo[]::new ;
        ArraysConsDemo array[] = a.action(3);
        array[0] = new ArraysConsDemo();
        array[1] = new ArraysConsDemo();
        array[2] = new ArraysConsDemo();
    }
 
}

 Fuction接口

在此之前的所有实例中,想要使用iambda表达式都需要先创建或调用已有的函数式接口,但java.util.function包已经提供了很多预定义函数式接口,就是没有实现任何功能,仅用来封装lambda表达式的对象,该包中最长用的接口时Function<T,R>,接口有以下两个泛型

T:被操作的类型,可以理解为方法参数类型
R:操作结果类型,可以理解为方法的返回类型
 表Function接口方法

方法    功能说明    方法返回值
apply(T  t)    抽象方法,按照被子类实现的逻辑,执行函数,参数为被操作泛型对象    R
andThen(Function<?super R? extends T>after)    限制性apply(t)方法将执行结果作为本方法参数按照after函数逻辑继续执行    (T t)->apply(apply(t))
compose (Function<?super V?extends>before)    先按照before函数逻辑操作接口被操作对象t,再将执行结果作为apply()方法的参数    (V v)->apply(before,appl有(v))
static identity()    此方法时静态方法,返回一个Function对象,此对象的apply()方法只会返回参数值    t->t
代码如下

package 第十四章;
 
import java.util.function.Function;
 
public class FunctionlnDemo {
    Function <Integer[],String>function = (n)->{
        StringBuilder str=new StringBuilder();
        for (Integer num:n) {
            str.append(num);
            str.append('.');
        }
        str.deleteCharAt(str.length()-1);
        return str.toString();
    };
    public static void main (String []args) {
        Integer [] ip = {192,168,1,1};
        System.out.print(demo.function.apply(ip));
    }
}

 14.3 流处理

流处理有点类似与数据库语句 可以执行非常复杂的过滤 映射 和查找 手机功能,并且代码量很少 但是唯一的确定时代码可读性不高,如果开发者基础不好可能看不懂 流API所表达的含义 

创建员工表封装成一个集合 里面有  名字  年龄  薪资   性别   部门   代码如下:

 14.3.2 Optional类

Optional类像是一个容器,可以保存任何对象,并且针对NullPointerException空指针异常做了优化,保证Optional类保存的值不会null。因此Optional类是针对“对象可能是针对null也可能不是null”

的场景为开发者提供了优质的解决方案,减少了繁琐的异常处理

Optional类是final修饰的,所以不能有子类 Optional类是带有反省的类,所以该类可以保存任何对象的值 

从Optional类的声明代码中就可以看出这种特性,JDK中的部分代码如下

public final class Optional<T>{
    private final Tvalue;
    ...//省略其中代码
}
Optional类中有一个叫做value的成员属性  这个属性就是用来保存具体值的  value 是用反省T修饰的,并且还用了final修饰,这表示一个Optional对象只能保存一个值

Optional类提供了很多的封装,校验,和获取值的方法  如下

方法    返回类型    
功能描述

empty()    Optional<T>    静态方法。返回一个表示空值的Optional实例
filter()    Optional<T>    
如果Optional实例的value是有值,并且该值与给定的条件匹配,则返回这个值的Optional实例,否则返回一个表示空值的Optional石磊

get()    T    如果Optional实例的value有值,则返回值否则抛出NoSuchElementException
of<T value>    Optional<T>    敬爱方法。返回一个value值等于参数值Optional实例
ofNullabel<T value>    
Optional<T

>

返回一个value值等于参数值的非null的Optional实例
orElse(T other)

T    如果Optional实例的value是优质的,则返回value的值,否则返回参数值
Collectors类

Collectors类为收集器类,该类实现了java.util.Collectors接口,可以将Stream流对象进行各种各样的封装,归集,分组等操作,同时,Collectors类还是提供了很多使用的数据加工方法,如数据统计计算等。Collectors类常用方法如下

方法    功能描述
averagingDouble(ToDoubleFunction<?super T>mapper)    计算流元素平均值
averagingInt(ToIntFunction<?super T >mapper)    计算流元素平均值
averagingLong(ToLongFunction<? super T> mapper)    计算流元素平均值
countiong()    统计元素个数
maxBy(Comparator<?super T>comparator)    返回符合条件的最大元素
minBy(Comparator<? super T >comparator)    返回符合条件的最小元素
summarizingInt(ToIntFunction<?super T>mapper)    返回流的元素的和
joining()           按照顺序将元素连接成一个String类型的数据
joining(CharSequence delimiter)           按照顺序将元素连接成一个String类型数据,并只当元素之间的分隔符
toList()    江流中的元素封装成List集合
toMap(Function<? superT,?extends K> ketMapper, Function <?super T,?extends U>value Mpper)

将流中的元素封装成Map集合
toSet()    将流中的元素封装成Set集合
groupingBy(Function<? super T,extends K> classifier)    根据分类函数对元素进行分组,并将结果封装成一个Mao集合
groupinBy(Function <? super ,?extends K>classifier,Collector<? super T A ,D>downstream)    根据分类函数对元素进行分组,并将结果封装成一个Map集合。第一个参数为一级分组条件,第二个参数为二级分组条件
数据查找

数据查找并不是在六种获取的数据(这属于数据过滤)而是判断流中释放符号条件数据,查找的结果时一个boolean值或者一个Optional类对象

1.allMatch()方法

allMatch()方法Stream接口提供的方法,该方法会判断流中的元素是否全部符合某一条件,返回结果是boolean值。如果所有都符合条件则返回true ,否则返回false。 代码如下:

代码图如下

 运行结果

Employee [name=灰太狼, age=33, salsary=14000.0, sex=男, dept=销售部]
数据分组

数据分组就是将六种元素按照指定的条件分组保存,类似SQL语言中的 CROUPBY关键字分组之后的数据会按照不同的标签别保存成一个集合,然后按照  键值关系封装在Map对象中 

代码如下

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

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

相关文章

我在明白软件测试这个道理后,涨薪10万

上升期的创业型公司 vs 大厂 如何抉择&#xff1f; 最近总有一些学生特别“凡尔赛”的发几个 offer 问我选择哪个&#xff1f;其中比较典型的一个问题就是&#xff1a; “一个是处于上升期的创业型公司 &#xff0c;一个行业大厂&#xff0c;薪资待遇差不多&#xff0c;到底该…

良心推荐,超好用老师小程序

各位老师&#xff0c;今天咱就来说说一件让你们省心省力的事儿——成绩查询系统。那些年&#xff0c;咱们或许都经历过手动发布成绩的痛苦&#xff0c;但现在&#xff0c;时代变了&#xff01;咱们有了小程序可以使用了&#xff0c;学生们可以自助查询成绩&#xff0c;省去了您…

Springboot+vue的班级综合测评管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的班级综合测评管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的班级综合测评管理系统&#xff0c;采用M&#xff08…

【微信小程序开发】自定义组件以及页面布局设计 )

【微信小程序开发】自定义组件以及页面布局设计 1.创建自定义组件2...在tabs的wxml文件中定制组件模板2.1.js中定义组件的属性2.2.定义组件的相关事件2.3在其他页面引用组件2.4在使用组件的wxml页面中使用组件2.5定义属性值 三。个人中心的实现 ) 1.创建自定义组件 要新建comp…

加密货币恐怖融资惊动国会!而链上分析公司看不下去了,紧急辟谣?

巴以冲突发生后&#xff0c;关于以加密货币资助恐怖分子的争论不断。全球最大的交易所币安和稳定币发行商Tether都表示己配合冻结多个账户和地址&#xff0c;以切断哈玛斯加密金援。美国合规交易所Coinbase也在近日发表了防止加密货币非法活动的宣言&#xff0c;反加密出名的参…

Mysql第二篇---InnoDB数据存储结构

Mysql第二篇—InnoDB数据存储结构 数据库的存储结构: 页 索引结构给我们提供了高效的索引方式, 不过索引信息以及数据记录都是保存在文件上的(innodb的ibd文件, MyISAM的MyI和MyD文件), 确切的说是存储在页结构中. 另一方面, 索引是在存储引擎中实现的, MySQL服务器上的存储引…

M-BUS和modbus的区别是什么?

M-BUS与Modbus是两种在工业自动化和楼宇自动化领域广泛应用的通信协议。那么&#xff0c;这两种通信协议有哪些区别呢?下面&#xff0c;就由小编带大家一起来了解下吧! 一、简介 M-BUS(Multi-dropBus&#xff0c;多点通信总线)和Modbus(莫迪波特率)都是用于设备和系统之间通信…

Python清理数据的常用方法总结

目录 1、数据预览 2、缺失值处理 3、异常值处理 4、数据类型转换 5、重复值处理 6、数据标准化 7、特征选择 8、处理类别数据 总结 在数据科学和机器学习领域&#xff0c;数据清理是一个非常重要的步骤。未经清理的数据可能会包含许多问题&#xff0c;例如缺失值、异常…

C++中多态的使用和建立条件

一、多态引入 多态按字面的意思就是多种形态。当类之间存在层次结构&#xff0c;并且类之间是通过继承关联时&#xff0c;就会用到多态。 C 多态意味着调用成员函数时&#xff0c;会根据调用函数的对象的类型来执行不同的函数。 根据代码&#xff0c;引入多态的概念&#xff1…

智能台灯语音控制丨解放双手

台灯是日常生活中一种常见的照明产品。以往的台灯大多都是采取手动控制&#xff0c;通过按键去对台灯的亮度进行调整。随着科技的发展&#xff0c;台灯也开始走向了智能化。人们已经能够对智能台灯进行语音控制&#xff0c;通过调节灯光开关、色温、灯光亮度等操作&#xff0c;…

代码随想录Day24 LeetCode T491 递增子序列 LeetCode T46 全排列 LrrtCode T47 全排列II

LeetCode T491 递增子序列 题目链接:491. 递增子序列 - 力扣&#xff08;LeetCode&#xff09; 题目思路: 首先这里的测试用例很容易误导我们,这道题不能使用上次子集的思路对数组先排序,使用一个used数组来解决问题. 我们用[4,7,6,7]举例这道题的递增序列不存在[4,6,7,7]这个…

“In Global,For China”,许战海咨询LOGO全面焕新

许战海咨询LOGO全面焕新&#xff0c;正式开启全球化战略! 作为一家起源于中国的全球性战略咨询公司&#xff0c;全新LOGO展现许战海咨询国际化企业形象&#xff0c;诠释出许战海咨询最新、最前沿的战略咨询理念“In Global&#xff0c;For China”(在全球&#xff0c;为中国)。…

CCF CSP认证 历年题目自练Day36

题目一 试题编号&#xff1a; 202309-1 试题名称&#xff1a; 坐标变换&#xff08;其一&#xff09; 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 问题描述 对于平面直角坐标系上的坐标 (x,y)&#xff0c;小 P 定义了一个包含 n 个操作的…

SOFAStack软件供应链安全产品解析——SCA软件成分分析

近年来&#xff0c;软件供应链安全相关攻击事件呈快速增长态势&#xff0c;造成的危害也越来越严重&#xff0c;为了保障软件供应链安全&#xff0c;各行业主管单位也出台了诸多政策及技术标准。基于内部多年的实践&#xff0c;蚂蚁数科金融级云原生PaaS平台SOFAStack发布完整的…

搞一个生成modbus报文的CRC校验码的可视化工具

用python搞个可视化界面&#xff1a; # -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QLineEdit, QPushButton, QMessageBox# 生成 Modbus 格式的 CRC 校验码 def crc16_modbus(data):crc 0xFFFFfor byte in data:crc …

C++类和对象(二)(类对象的存储方式)

类对象模型 1 如何计算类对象的大小 class A { public: void PrintA() {cout<<_a<<endl; } private: char _a; }; 问题&#xff1a;类中既可以有成员变量&#xff0c;又可以有成员函数&#xff0c;那么一个类的对象中包含了什么&#xff1f;如何计算一个类的大小&…

混淆矩阵绘制

import numpy as np import matplotlib.pyplot as plt from sklearn.metrics import confusion_matrix# 示例的真实标签和预测标签 true_labels [cat, dog, bird, cat, dog, bird, cat, bird, bird] predicted_labels [cat, bird, dog, cat, bird, dog, cat, cat, bird]# 确定…

vue elementUI form组件动态添加el-form-item并且动态添加rules必填项校验方法

vue elementUI form组件动态添加el-form-item并且动态添加rules必填项校验方法 先看一下效果图&#xff08;想在表单里动态的增删 form-item&#xff0c;然后添加rules&#xff0c;校验其必填项&#xff1b; &#xff09;: html部分 <div v-for"(item, index) in …

Spring创建复杂对象

目录 一、什么是复杂对象 二、创建复杂对象的3种方式 2.1 实现FactoryBean接口 2.1.1 普通的创建方式 2.1.1 依赖注入的方式 2.1.3 FactoryBean的工作原理 2.2 实例工厂 2.3 静态工厂 一、什么是复杂对象 书接上回&#xff0c;我们已经分析了Spring是怎么去创建对象的了。那什…

【公众号开发】访问第三方接口应用于开发 · 回复图文消息

【公众号开发】&#xff08;2&#xff09; 文章目录 【公众号开发】&#xff08;2&#xff09;1. 第三方接口1.1 申请免费接口1.2 解读接口文档1.3 postman测试接口1.4 公众号开发访问第三方接口原理1.5 访问第三方接口示例1.5.1 引入依赖1.5.2 获取form格式的body字符串的方法…