java 8--Lambda表达式,Stream流

news2024/11/20 21:20:35

目录

Lambda表达式

Lambda表达式的由来

Lambda表达式简介

Lambda表达式的结构

Stream流

什么是Stream流?

什么是流呢?

Stream流操作

中间操作

终端操作


Lambda表达式

Lambda表达式的由来

Java是面向对象语言,除了部分简单数据类型,Java中的一切都是对象,即使数组也是一种对象。

在Java中定义的方法不可能完全独立,也不能将方法作为参数或返回一个方法给实例。

在Java8以前,若我们想要把某些功能传递给某个方法,总要去写内部类或匿名内部类。

简而言之,在Java里将普通的方法像参数一样传值并不简单,为此,Java8增加了一个语言级的新特性,名为Lambda表达式。

Lambda表达式简介

Lambda表达式是一个匿名函数,我们可以把lambda表达式理解为一段可以传递的代码(将代码段像数据一样传递)。

Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。

使用它可以写出更简洁,更灵活的代码。作为一种更紧凑的代码风格,使java语言的表达式能力得到的提升。

Lambda表达式的结构

  • Lambda表达式可以具有零个,一个或多个参数。
  • 可以显式声明参数的类型,也可以由编译器自动从上下文推断参数的类型。例如:(int a,int b)与(a,b)相同。
  • 参数用小括号括起来,用逗号分隔。例如(a,b)或(int a,int b)或(String a,int b,float c)。
  • 空括号用于表示一组空的参数。例如:()->42。
  • 当有且仅有一个参数时,如果不显式指明类型,则不必使用小括号。例如:a->returna*a
  • Lambda表达式的正文可以包含零条,一条或多条语句。
  • 如果Lambda表达式的正文只有一条语句,则大括号可不用写,且表达式的返回值类型要与匿名函数的返回类型相同。
  • 如果Lambda表达式的正文有一条以上的语句必须包含在大括号(代码块)中,且表达式的返回值类型要与匿名函数的返回类型相同。
import javax.swing.*;
import java.util.ArrayList;

public class lambda {
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("c");

        //当排序时,需要定义排序规则
        //arrayList.sort(new StringComparator());
        arrayList.sort((a, b) -> {//用Lambda表达式实现
            return a.compareTo(b);
        });
        //匿名内部类, 为了减少类的创建
        //此处功能核心compareTo方法,但是java是面向对象的,方法是不能独立的存在的,必须将方法包装在对象中
        /* arrayList.sort(new Comparator<string>(){
              @Override
              public int compare(string ol, string o2){
              return o1.compareTo(o2);
            }
         });*/
        System.out.println(arrayList);

        //集合遍历
        arrayList.forEach((e)->{//用Lambda表达式实现
            System.out.println(e);
        });
    }
}

Stream流

什么是Stream流?

Stream是Java8的新特性,它允许你以声明式的方式处理数据集合,可以把它看作是遍历数据集的高级迭代器。

此外与stream与lambada表达示结合后编码效率与大大提高,并且可读性更强。

要澄清的是java8中的stream 与 InputStream 和 OutputStream 是完全不同的概念。

什么是流呢?

 简单的定义,就是“从支持数据处理操作的源,生成的元素序列”。

元素列表:和集合一样,流也提供了一个接口,访问特定元素类型的一组有序值。

数据源:获取数据的源,比如集合。

数据处理操作:流更偏向于数据处理和计算,比如filter、map、find、sort等。

简单来说,我们通过一个集合的stream方法获取一个流,然后对流进行一系列流操作,最后再构建成我们需要的数据集合。

Stream流操作

简单来说就是:

数据源=>中间操作=>终端操作=>结果

1、获取流,把集合/数组转为Stream对象

package De;

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

public class Demo1 {
    public static void main(String[] args) {
        //1、将集合转为流
        ArrayList<Integer> arrayList=new ArrayList<>();
                           arrayList.add(1);
                           arrayList.add(2);
                           arrayList.add(3);
                           arrayList.add(4);

        Stream<Integer> stream=arrayList.stream();//将集合转为流
        //2、将数组转为流
        Integer[] array=new Integer[]{1,2,3,4};
        Stream<Integer> stream1= Arrays.stream(array);//把数组转为流
        //3、调用Stream.of方法转为流
        Stream stream2=Stream.of(1,2,3,4,5);
    }
}

2、经过流操作

流的操作分为:
     中间操作: 流的各种数据处理
     终端操作: 把流转为最终结果(数组/集合/单值)

中间操作

filter:过滤流中的某些元素
sorted():自然排序,流中元素需实现 Comparable 按口
distinct: 去除重复元素
limit(n):获取 n 个元素
skip(n):跳过n元素,配台limit(n)可实现分页
map:将对象中某个属性的值映射到一个新集合中

    public static void main(String[] args) {
        Integer[] array=new Integer[]{1,2,3,4};

         Arrays.stream(array)
                .skip(1)//跳过指定数量个元素
                .limit(2)//取出指定数量个元素
                .forEach((e) ->{
                    System.out.println(e);
                });
        System.out.println("------");
        Arrays.stream(array).filter((e)->{//过滤
            return e>0;
        }).sorted((o1, o2) -> {
            return o2-o1;
        }).distinct()//去重
        .forEach((e)->{
            System.out.println(e);
        });

    }

 

终端操作

把流转为最终结果(数组/集合/单值)
Min:返回流中元素最小值
Max:返回流中元素最大值
count:返回流中元素的总个数
Reduce:所有元素求和
anyMatch:按收一个 Predicate 函数,只要流中有一个元素满足条件则返true,否则返回 false
allMatch:接收一个 Predicate 函数,当流中每个元素都符合条件时才返true,否则返回 false
findFirst:返回流中第一个元素
package De;

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

public class Demo2 {
    public static void main(String[] args) {
        Integer[] array=new Integer[]{1,2,3,4,4,5,6};
        //Min:返回流中元素最小值
        Integer min=Arrays.stream(array)
                       .distinct().min((o1, o2) -> {
                           return o1-o2;
                }).get();
        System.out.println(min);
        //Max:返回流中元素最大值
        Integer max=Arrays.stream(array)
                .distinct().max((o1, o2) -> {
                    return o1-o2;
                }).get();
        System.out.println(max);
        //count:返回流中元素的总个数
        long count=Arrays.stream(array)
                .distinct().count();
        System.out.println(count);
        //Reduce:所有元素求和
        long sum=Arrays.stream(array)
                .distinct().reduce((o1, o2) -> {
                    return o1+o2;
                }).get();
        System.out.println(sum);
        //anyMatch:按收一个 Predicate 函数,只要流中有一个元素满足条件则返true,否则返回 false
        boolean result1=Arrays.stream(array)
                .distinct().anyMatch((e)->{
                    return e>4;
                });
        System.out.println(result1);
        // allMatch:接收一个 Predicate 函数,当流中每个元素都符合条件时才返true,否则返回 false
        boolean result=Arrays.stream(array)
                .distinct().allMatch((e)->{
                    return e>4;
                });
        System.out.println(result);
        //findFirst:返回流中第一个元素
        Integer res=Arrays.stream(array)
                .distinct().findFirst().get();
        System.out.println(res);

    }
}

如果对于一个对象而言,同样也适用。

public class Demo2 {
    public static void main(String[] args) {

        student s1=new student(101,"张三",20);
        student s2=new student(102,"李四",21);
        student s3=new student(103,"王五",22);
        student s4=new student(104,"老刘",20);
        student s5=new student(105,"杨一",24);
        ArrayList<student> students=new ArrayList<>();
        students.add(s1);
        students.add(s2);
        students.add(s3);
        students.add(s4);
        students.add(s5);

        //sorted():自然排序,流中元素需实现 Comparable 按口
        List<student> students1=students.stream()
                                .sorted((s,y)->{
                                    return s.getNum()-y.getNum();
                                })
                                .collect(Collectors.toList());
        System.out.println(students1);
        //filter:过滤流中的某些元素
        List<student> students2=students.stream()
                                .filter((s)->{
                                    return s.getAge()>22;
                                })
                                .collect(Collectors.toList());
        System.out.println(students2);
        // map:将对象中某个属性的值映射到一个新集合中
        Object[] array1=students.stream()
                        .map(student::getNum)
                        .toArray();
        System.out.println(Arrays.toString(array1));
        //
        List list=students.stream()
                  .map(student::getNum)//)//将对象中某个属性的值映射到一个新集合中
                  .collect(Collectors.toList());
        System.out.println(list);
}
}


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

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

相关文章

【机器学习】前沿探索,如何让前端开发更加搞笑

在当今数字化时代&#xff0c;机器学习的崛起为前端开发带来了巨大的机遇和挑战。随着人工智能和数据科学的不断进步&#xff0c;前端工程师不再局限于传统的界面设计和交互体验&#xff0c;而是开始探索如何将机器学习技术融入到他们的工作中&#xff0c;以创造更加智能、个性…

适合暑期做的赚钱副业兼职有哪些?盘点6个适合暑期做的赚钱副业

随着夏日的热浪滚滚而来&#xff0c;学生们纷纷结束了忙碌的学期&#xff0c;迎来了盼望已久的暑假。你是否想过在这个长假里&#xff0c;除了享受阳光、海滩和美食外&#xff0c;还能顺便赚点零用钱呢&#xff1f; 今天&#xff0c;就为大家揭秘六大神秘副业&#xff0c;让你在…

【漏洞复现】海康威视综合安防管理平台 iSecure Center applyCT fastjson 远程代码执行

0x01 漏洞名称 海康威视综合安防管理平台 iSecure Center applyCT fastjson 远程代码执行 0x02 漏洞影响 0x03 搜索引擎 app"HIKVISION-综合安防管理平台"0x04 漏洞详情 POST /bic/ssoService/v1/applyCT HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Wi…

程序语言基础知识

文章目录 1.程序设计语言2. 程序设计语言的特点和分类3. 编译程序&#xff08;编译器&#xff09;的工作原理4. 程序语言的数据成分4.1 数据成分4.2 运算成分4.3 控制成分4.4 传输成分 1.程序设计语言 低级语言&#xff1a;机器语言和汇编语言。 机器语言&#xff1a;二进制代…

正确可用--Notepad++批量转换文件编码为UTF8

参考了:Notepad批量转换文件编码为UTF8_怎么批量把ansi转成utf8-CSDN博客​​​​​​https://blog.csdn.net/wangmy1988/article/details/118698647我参考了它的教程,但是py脚本写的不对. 只能改一个.不能实现批量更改. 他的操作步骤没问题,就是把脚本代码换成我这个. #-*-…

浅谈后端整合Springboot框架后操作基础配置

boot基础配置 现在不访问端口8080 可以吗 我们在默认启动的时候访问的是端口号8080 基于属性配置的 现在boot整合导致Tomcat服务器的配置文件没了 我们怎么去修改Tomcat服务器的配置信息呢 配置文件中的配置信息是很多很多的... 复制工程 保留工程的基础结构 抹掉原始…

yolov8训练自己数据集时出现loss值为nan。

具体原因目前暂未寻找到。 解决办法 将参数amp改成False即可。 相关资料&#xff1a; https://zhuanlan.zhihu.com/p/165152789 https://github.com/ultralytics/ultralytics/issues/1148

声纹识别在无人机探测上的应用

无人机在民用和军事领域的应用越来越广泛。然而&#xff0c;随着无人机数量的增加&#xff0c;"黑飞"现象也日益严重&#xff0c;对公共安全和隐私构成了威胁。因此&#xff0c;开发有效的无人机探测与识别技术变得尤为重要。及时发现黑飞无人机的存在进而对其型号进…

自动驾驶决策规划算法——二次规划

自动驾驶决策规划算法第二章第二节(中) 参考线算法_哔哩哔哩_bilibili 动态规划开辟的凸空间如下&#xff0c;两条橙色线之间&#xff1a; 黄色的点就意味着L的上下界&#xff0c;物理意义是当轨迹ss1时&#xff0c;L的范围应该是(Lmin1,Lmax1)之间&#xff0c;这个范围就是开辟…

逻辑漏洞靶场通关

会员中心注册新用户test&#xff0c;密码123123 会员中心注册新用户name&#xff0c;密码abcabc 管理员账号admin&#xff0c;密码123456 1.普通账号间水平越权漏洞测试 一个网站登录普通账号test后修改信息时进行抓包 在重发器中修改普通账号test为普通账号name&#xff0c;并…

给树莓派配置静态IP地址

第一步&#xff1a;查找默认网关 打开windowr&#xff1b;输入cmd&#xff0c; 输入 最后一行就是默认网关 ipconfig第二步&#xff1a;确定分配好给树莓派的IP地址 要注意&#xff1a;&#xff08;1&#xff09;静态ip地址与路由器网段保持一致&#xff08;2&#xff09;与…

Linux操作系统最著名的两大系列Red Hat和Debian

Linux操作系统可以根据其背后的项目或社区分为不同的系列&#xff0c;其中最著名的两大系列是Red Hat系列和Debian系列。 1.著名的两大系列是Red Hat和Debian Red Hat系列&#xff1a; Red Hat Enterprise Linux (RHEL)&#xff1a;这是Red Hat公司推出的企业级操作系统&#…

数据库同步软件,天不生PanguSync万古如长夜

在信息时代的海洋中&#xff0c;数据是那永不熄灭的灯塔&#xff0c;照亮了科技发展的航道。然而&#xff0c;随着数据的膨胀和应用场景的多样化&#xff0c;如何确保这些宝贵资源在不同平台、不同设备间实时更新、保持一致性&#xff0c;便成了一道亟待解决的难题。于是&#…

SSM【Spring SpringMVC Mybatis】—— SpringMVC

目录 1、初识SpringMVC 1.1 SpringMVC概述 1.2 SpringMVC处理请求原理简图 2、SpringMVC搭建框架 2.1 搭建SpringMVC框架 3、RequestMapping详解 3.1 RequestMapping注解位置 3.2 RequestMapping注解属性 3.3 RequestMapping支持Ant 风格的路径&#xff08;了解&#…

摄像头应用测试

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

单向无头链表实现

目录 1. 为什么要有链表&#xff1f; 2. 链表的种类 3. 具体功能实现 &#xff08;1&#xff09;节点结构体定义 &#xff08;2&#xff09;申请节点 &#xff08;3&#xff09;尾插 &#xff08;4&#xff09;尾删 &#xff08;5&#xff09;头插 &#xff08;6&#…

CST电磁软件工作室时域求解器和频域求解器介绍【仿真入门】

时域求解器vs.频域求解器 不同情形下选择Time Domain Solver还是Frequency Domain Solver? 三维电磁仿真支持的具有代表性的两种求解器-Time Domain Solver和Frequency DomainSolver以不同的方式计算出仿真结果&#xff0c;所以根据仿真的情形可以选择性地使用两个Solver。 …

BCD编码Java实现

最常用的BCD编码&#xff0c;就是使用"0"至"9"这十个数值的二进码来表示。这种编码方式&#xff0c;在称之为“8421码”&#xff08;日常所说的BCD码大都是指8421BCD码形式&#xff09;。除此以外&#xff0c;对应不同需求&#xff0c;各人亦开发了不同的编…

图论-最短路算法

1. Floyd算法 作用&#xff1a;用于求解多源最短路&#xff0c;可以求解出任意两点的最短路 利用动态规划只需三重循环即可&#xff08;动态规划可以把问题求解分为多个阶段&#xff09;定义dp[k][i][j]表示点i到点j的路径&#xff08;除去起点终点&#xff09;中最大编号不超…

React类组件生命周期详解

在React的类组件中&#xff0c;从组件创建到组件被挂载到页面中&#xff0c;这个过程react存在一系列的生命周期函数&#xff0c;最主要的生命周期函数是componentDidMount、componentDidUpdate、componentWillUnmount 生命周期图例如下 1. componentDidMount组件挂载 如果你…