Stream

news2025/1/13 10:21:18

目录

一 函数式接口

1 特点

2 核心函数式接口

1) Consumer

2) Supplier

3) Function

4) Predicate

5) 扩展:BiFunction

二 Stream

1 stream操作过程

1) 中间操作

2)终端操作

2 创建Stream对象

1) 通过集合获得Stream对象

2) 其他

3 终端操作

forEach()

count() , max() , min()

collect()

4 中间操作

filter()

map()

sorted()

limit() & skip()


一 函数式接口

1 特点

  • 接口中有且仅有一个抽方法

  • 可以使用lambda表达式

  • 可以使用@FunctionalInterface声明接口

  • 在函数式接口中,可以定义多个默认的非抽象方法

2 核心函数式接口

jdk中给我们提供了一些常用的函数式接口

jdk1.8以前,就存在函数式特点接口 : Compartor ,Comparable

jdk1.8以后,提供了一些常用的函数式接口,其中有4个核心接口

1) Consumer

消费型接口 ,传递参数,使用参数做一个处理。没有返回值 void accept(T t);

Consumer<String> mc = (String s1)->{
    System.out.println(s1.length());
};
mc.accept(s);
//-------------------------------------------
Consumer<String> mc1 = (String s1)->{
    System.out.println(s1.length());
};
Consumer<String> mc2 = (String s1)->{
    System.out.println(s1.toUpperCase());
};
Consumer<String> mc3 = s1->{
    System.out.println(s1.substring(0,5));
};
//mc2.accept(s);

//这是一个链式操作,先实现消费功能mc3,再实现消费功能mc2,最后实现消费功能mc1
mc3.andThen(mc2.andThen(mc1)).accept(s);

2) Supplier

供给型接口, 无需要传递参数,返回对象 T get();

//需要产生一个随机数
//创建了一个对象 Object obj = new Object()
Supplier<Integer> s1 = ()->{
    Random r = new Random();
    return r.nextInt(10);
};
Integer num = s1.get() ;

3) Function

功能型接口,需要传递参数,根据参数做处理,将处理结果返回 R apply(T t); Function<T,R>

String s = "dmc is good" ;
//需要实现功能,将字符串转换成大小
Function<String,String> f1 = (String s1)->{
    return s1.toUpperCase();
};
System.out.println( f1.apply(s) );
//---------------------------------------------
String s = "dmc is good" ;
//需要实现功能,将字符串转换成大小
Function<String,String> f1 = (String s1)->{
    System.out.println("1操作");
    return s1.toUpperCase();
};
//System.out.println( f1.apply(s) );

Function<String,String> f2 = s1->{
    System.out.println("2操作");
    return s1.substring(0,3);
};

//f1处理后,再进行一次f2的处理
//System.out.println( f1.andThen(f2).apply(s) );
//f1处理前,先进行一次f2的处理
System.out.println( f1.compose(f2).apply(s) );

4) Predicate

断言型接口,传递参数,根据参数做判断,返回boolean boolean test(T t)

//判断user登录信息是否正确
Predicate<User> p1 = (User user1)->{
    return user1.uname.equals("dmc") && user1.upass.equals("123");
};
System.out.println(p1.test(user)?"登录成功":"登录失败");
//----------------------------------------------
User user = new User("dmc","1234") ;
//判断user登录信息是否正确
Predicate<User> p1 = (User user1)->{
    return user1.uname.equals("dmc") ;
};
Predicate<User> p2 = (User user1)->{
    return user1.upass.equals("123") ;
};

//函数式接口中的链式功能,基于的是一个对象
System.out.println(p1.or(p2).test(user)?"登录成功":"登录失败");
System.out.println(p1.negate().test(user));

5) 扩展:BiFunction

R apply(T t,U u); BiFunction<T,U,R>

Num num = new Num(10,20);
Function<Num,Integer> f1 = (num1)->num.x + num.y ;
//------------------------------------------
//二元操作功能
BiFunction<Integer,Integer,Integer> b1 = (x , y)-> x+y ;
System.out.println(b1.apply(10,20));

二 Stream

1 stream操作过程

stream操作分为2部分

如果没有终端操作,中间操作无法验证结果。

只有终端操作执行时,中间操作才开始执行。(在终端操作执行前,中间操作只是一个标记)

 

1) 中间操作

中间操作本身不会执行,只是一个标记,会在终端操作执行时才执行。

中间操作语法会返回一个Stream对象,可以以链式的方式增加多个中间操作(标记)

2)终端操作

要么返回一个具体的数据,要么就执行遍历操作,什么都不返回(void)

整个流操作在执行终端操作方法时就结束了(如果有后续操作,也不是流操作,或者是一个新的流操作)

2 创建Stream对象

1) 通过集合获得Stream对象

jdk1.8之后,为List , Set , Conllection 增加Stream()方法获得流对象

流对象中装载的就是集合中的数据

list.stream()
set.stream()
collection.stream()

2) 其他

//上面我们通过集合获得流的时候是先把数据存到集合里,在获得流的时候将数据存到流里
//下面的这种方法是直接将数据存到流里面
Stream.of(1,2,3,4,5); 
//这种是通过传入一个Supplier,然后通过Supplier返回的对象存入到流中,通过limit的参数表示在流中存入多少个Supplier提供的对象
Stream.generate(()->"dmc").limit(100);
//这种是在流中存入数据1~100
Stream.iterate(1,(i)->++i).limit(100)

3 终端操作

forEach()

参数是个Consumer 消费型接口 
//执行forEach方法时,底层就会遍历每一个元素,每次(底层)遍历获得一个元素,就会调用我们提供的消费功能进行处理(策略模式)
List<Car> cars = Arrays.asList(
    new Car("宝马","蓝色",300000),
    new Car("奔驰","黑色",400000),
    new Car("奥迪","红色",450000),
    new Car("保时捷","蓝色",600000),
    new Car("本田","白色",2000000),
    new Car("比亚迪","白色",220000),
    new Car("理想","黑色",250000)
);
cars.stream()
    .forEach(System.out::println);

count() , max() , min()

Object obj = cars.stream()
    .filter(car->car.color.equals("白色"))
    .count();
System.out.println(obj);
//-------------------------------------------
Object obj = cars.stream()
    .max((c1,c2)->c1.price - c2.price);
System.out.println(obj);

collect()

//汇总
//collect终端方法执行时,会遍历所有的元素,会将每个元素的price属性值收集起来,求和
Object obj = cars.stream()
    .collect(Collectors.summingInt(car->car.price));
System.out.println(obj);

//分组(汇总)
Object obj = cars.stream()
    .collect(Collectors.groupingBy(car->car.color));
System.out.println(obj);

Object obj = cars.stream()
    .collect(Collectors.groupingBy(car->{
        if(car.price<=300000){
            return "便宜" ;
        }else{
            return "昂贵" ;
        }
    }));
System.out.println(obj);

4 中间操作

filter()

参数是个Predict 断言型接口  
cars.stream()
    .filter(car->"黑色".equals(car.color))
    .forEach(System.out::println);

map()

参数是函数型接口 Function
//map就是在所有的属性中,抽取出部分需要的属性
//案例中就是在car的3个属性中,抽取出cname和price2个属性
cars.stream()
    .map(car->{return new Car2(car.cname,car.price); })
    .forEach(System.out::println);

List<User> ---> List<UserVO>

sorted()

可以没有参数,默认是按照升序排列的,还有一个带参数的方法Stream<T> sorted(Comparator<? super T> comparator);
	可以自定义排序规则
//排序  
cars.stream()
    .sorted((c1,c2)->c1.price-c2.price)
    .forEach(System.out::println);

//关于比较器,可以看TreeSet

limit() & skip()

limit(long n1)表示从stream中取出n1的个数
skip(long n2) 表示跳过stream中的前面n2个数
//分页,从那条记录开始,取几条记录, 从0开始取3条(0,1,2),从3开始取3条(3,4,5),从6开始取3条(7,8,9)
cars.stream()
    .sorted((c1,c2)->c1.price-c2.price)
    .skip(4) //跳过几个,因为时从0开始条,这个条过几个,也可以理解为从第几个开始
    .limit(3)
    .forEach(System.out::println);

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

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

相关文章

[附源码]java毕业设计汽车票售票系统lunwen

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

太湖“生态度假式”年会,为您的健康守护,为您的相聚喝彩

最近几年经常听到&#xff0c; 有人说今年最大的目标就是活着&#xff0c; 历经风雨&#xff0c;方知岁月静好的可贵&#xff0c; 这特殊的一年又一年里让大家深觉“健康”的重要&#xff0c; 也让我们更热爱彼此、热爱生活。 倏忽间&#xff0c;2022已至尾声&#xff0c; 又到…

【ASM】字节码操作 工具类与常用类 GeneratorAdapter 介绍

文章目录 1.概述2. GeneratorAdapter2.1 class info2.2 fields2.3 构造方法2.4 方法2.5 特殊方法2.5.1 loadThis2.5.2 getArgIndex2.5.2 box &3. 案例4.总结1.概述 在上一篇文章中:【ASM】字节码操作 工具类与常用类 AdviceAdapter 介绍 打印方法进入 和 方法退出 的参数…

[附源码]SSM计算机毕业设计远程在线教育平台JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【蓝桥杯物联网赛项学习日志】Day4 关于USART/UART

关键词&#xff1a;USART UART 串口通信 理论基础 USART/UART USART(Universal Synchronous/Asynchronous Receiver/Transmitter) 通用 同步/异步 串行 接收/发送器是一种串行通信接口。USART最多有5个信号&#xff0c;分别是TX,RX,nCTS.nRTS,SCLK TX串行输出信号RX串行输…

SpringBoot整合freemarker模板导出word文件

文章目录1、前言2、需求说明3、编码3.1、导入依赖3.2、接口编写3.3、工具类3.4、ftl文件3.5、测试4、word转pdf5、总结1、前言 在项目中我们有时间需要根据一个word模板文档&#xff0c;批量生成其他的word文档&#xff0c;里面的有些值改变一下而已&#xff0c;那怎么做呢&am…

【Logback+Spring-Aop】实现全面生态化的全链路日志追踪系统服务插件「SpringAOP 整合篇」

承接前文 针对于上一篇【LogbackSpring-Aop】实现全面生态化的全链路日志追踪系统服务插件「Logback-MDC篇」的功能开发指南之后&#xff0c;相信你对于Sl4fj以及Log4j整个生态体系的功能已经有了一定的大致的了解了&#xff0c;接下来我们需要进行介绍关于实现如何将MDC的编程…

家庭实验室系列文章-如何迁移树莓派系统到更大的 SD 卡?

前言 其实这个专题很久很久之前就想写了&#xff0c;但是一直因为各种原因拖着没动笔。 因为没有资格&#xff0c;也没有钱在一线城市买房 (&#x1f602;&#x1f602;&#x1f602;); 但是在要结婚之前&#xff0c;婚房又是刚需。 我和太太最终一起在一线城市周边的某二线城…

【面试题】详解Cookie、localStorage、sessionStorage区别

【面试题】详解Cookie、localStorage、sessionStorage区别 三者基本概念 Cookie localStorage sessionStorage 安全性的考虑 Cookie、localStorage、sessionStorage、indexedDB对比 应用场景 Token一般放在哪里&#xff1f;&#xff1f;&#xff1f; 放在Cookie 放…

【openGauss】在WPS表格里制作连接到openGauss的实时刷新报表

前言 其实我的数据库启蒙&#xff0c;是在一家甲方公司。 当时一进这家公司&#xff0c;就见到了通过连接数据库自动刷新的excel表。当时学会了这招就一发不可收拾&#xff0c;制作出各种自动刷新的报表。 想象一下&#xff0c;有些高管不喜欢打开各种复杂的业务系统或者报表系…

【JS基础】在js中如何简单的使用正则表达式

文章目录前言创建正则字符类型的匹配方法searchreplacematch正则的匹配方法test转义特殊符号冲突正则创建问题记一些规则符号修饰符原子表[]和原子组()配合转义字符其他字符量词一些实用的正则前言 关于正则表达式的介绍&#xff0c;推荐看这篇文章正则表达式30分钟入门教程&a…

[附源码]java毕业设计商务酒店管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

鲁棒无范围定位算法 (RRGA)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

LVS-NAT集群搭建

目录 一、环境准备 1、准备三台centos服务器 2、实验拓扑 3、NAT模式介绍 二、LVS-NAT模式部署 1、给lvs服务器安装LVS 2、新建LVS集群 3、添加Real Server服务器节点 4、开启路由转发 5、给后端web服务器配置网关 6、效果测试 一、环境准备 1、准备三台centos服务器…

【C++右值引用】左右值的交叉引用的具体情景,右值详讲

目录 1.右值和左值 2.左值引用和右值引用 3.左右值的交叉引用的具体情景 3.4当不接受返回值就没有办法优化 1.右值和左值 左值与右值是C语言中的概念&#xff0c;但C标准并没有给出严格的区分方式&#xff0c;一般认为&#xff1a;可以放在左边的&#xff0c;或者能 够取地…

基于stm32单片机的光照检测智能台灯

资料编号&#xff1a;101 下面是相关功能视频演示&#xff1a; 101-基于stm32单片机的光照检测智能台灯照明灯Proteus仿真&#xff08;仿真源码全套资料&#xff09;功能介绍&#xff1a; 1、设置为自动模式下&#xff1a;可以检测光照强度&#xff0c;当光照强度<100Lux的…

QT QThread 多线程操作

在QT中&#xff0c;QT应用程序所在的线程为主线程&#xff0c;也称为“GUI线程”&#xff0c;QT GUI必须运行在此线程上&#xff1b;而非主线程称为“工作者线程”&#xff0c;主要处理从主线程中卸下的一些工作&#xff0c;例如数据的同步访问等。需要明确的是&#xff0c;同一…

SSH框架过时了吗?那就最后分享一份阿里架构师整合的SSH框架实战心得吧!

记得当年 java 的企业级框架还是 ssh 的天下&#xff08;spring&#xff0c;struts和hibernate&#xff09;&#xff0c;但是现在感觉 spring 已经完全把那两个框架甩在后边了。用 spring 的人越来越多&#xff0c;用 struts 的人比原来少多了&#xff0c;用 hibernate 的就更少…

BI-SQL丨SNAPSHOT

快照&#xff08;SNAPSHOT&#xff09; 我们在做BI项目的过程&#xff0c;一旦数据涉及到数据库&#xff0c;那么需要考量到的点就比较多。 1.如果数仓是在项目过程中搭建的&#xff0c;那么需要考虑高可用、灾备机制以及安全性问题&#xff1b; 2.如果我们只是需要连接数据库…

Vue3留言墙项目——头部和底部静态页面搭建

文章目录创建项目头部底部创建项目 Vue中使用scss 头部 头部当中有两个按钮&#xff0c;然后根据设计稿可知&#xff0c;本留言墙中有4个按钮&#xff0c;所以可以自己封装一个按钮组件 按钮组件的博客 components/TopNav.vue <template><div class"topNav…