Stream流体系

这篇具有很好参考价值的文章主要介绍了Stream流体系。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

视频地址https://www.bilibili.com/video/BV1Cv411372m?

1 Stream流概述

  • 目的:简化集合和数组操作的API,结合了Lambda表达式。

  • Stream流式思想的核心:

    1. 先得到集合或者数组的Stream流(就是一根传送带)
    2. 把元素放上去
    3. 用这个Stream流简化的API来方便的操作元素

2 Stream流获取

  1. Stream流的三类方法:
  • 获取Stream流
    • 创建一条流水线,并把数据放到流水线上准备进行操作。
  • 中间方法
    • 流水线上的操作。一次操作完毕之后,还可以继续进行其他操作。
  • 终结方法
    • 一个Stream流只能有一个终结方法,是流水线上的最后一个操作。
  1. Stream操作集合或者数组的第一步是先得到Stream流,然后才能使用流的功能。
  • 集合获取Stream流的方式
    使用Collection接口中的默认方法stream()生成流
    Stream流体系
	/***Collection集合获取流********/
	Collection<String> list  = new ArrayList<>();
	Stream<String> s = list.stream();

	/*** Map集合获取流*/
	Map<String,Integer> maps = new HashMap<>();
	//键流
	Stream<String> keyStream = maps.keySet().stream();
	// 值流
	Stream<Integer> valueStream = maps.values().stream();
	//键值对流(拿整体)
	Stream<Map.Entry<String, Integer>> keyAndValueStream = maps.entrySet().stream();
  • 数组获取Stream流的方式
    Stream流体系
	/**数组获取流****/
	String[] names = {"张三","李四","王五","范二"};
	Stream<String> nameStream = Arrays.stream(names);
	Stream<String> nameStream2 = Stream.of(names);

3 Stream流的常用API

3-1 中间操作方法

Stream流体系
注意:

  • 中间方法也称为非终结方法,调用完成后返回的新的Stream流可以继续使用,支持链式编程。
  • 在Stream流中无法直接修改集合、数组中的数据。

示例

  1. 过滤:查找出以"张"开头的人的名字
list.stream().filter(s->s.startsWith("张")).forEach(s-> System.out.println(s));
  1. 统计字符串长度为3的蒜素个数
long size = list.stream().filter(s -> s.length() == 3).count();
  1. limit获取前几个元素

forEach(s -> System.out.println(s)
当s和sout内的s是相同元素时,可以简写成System.out::println
filter代表开始过滤,->代表开始过滤,

list.stream().filter(s -> s.startsWith("张")).limit(2).forEach(s -> System.out.println(s));
list.stream().filter(s -> s.startsWith("张")).limit(2).forEach(System.out::println);
  1. skip跳过前几个元素
list.stream().filter(s -> s.startsWith("张")).skip(2).forEach(System.out::println);
  1. Map:加工方法 :第一个方法为原材料,第二个参数是加工后的结果
  • 给集合元素前面都加上一个前缀xxx
list.stream().map(s -> "xxxx"+s).forEach(System.out::println);
  • 把所有名字都加工成一个学生对象
2为1的简写
1、list.stream().map(s -> new Student(s)).forEach(System.out::println);
2、list.stream().map(Student::new).forEach(System.out::println);
  1. 合并流
//public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
//两个不同流合并,例如流1是String类型,流2是Integer类型,此时合并后的流需要是流1和流2的父类,即父类可以接收子类
Stream<String> s1 = list.stream().filter(s -> s.startsWith("张"));
Stream<String> s2 = Stream.of("Java1","Java2");
Stream<String> s3 = Stream.concat(s1,s2);
s3.distinct().forEach(System.out::println);

3-2 终结操作方法

Stream流体系
注意:终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了。

4 Stream流的综合应用

Stream流体系

  1. 新建一个类存储员工信息
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {
    private String name;
    private char sex;
    private double salary;
    private double bonus;
    private String punish; //处罚信息
}
  1. 定义两个集合,并向集合中添加元素
List<Employee> one = new ArrayList<>();
one.add(new Employee("猪八戒",'男',30000,25000,null));
one.add(new Employee("孙悟空",'男',25000,1000,"迟到"));
one.add(new Employee("沙僧",'男',2000,20000,null));
one.add(new Employee("小白龙",'男',20000,25000,null));

List<Employee> two = new ArrayList<>();
two.add(new Employee("武松",'男',15000,9000,null));
two.add(new Employee("李逵",'男',25000,10000,null));
two.add(new Employee("西门庆",'男',50000,10000,"迟到"));
two.add(new Employee("潘金莲",'女',3500,1000,"打人"));
two.add(new Employee("武大郎",'女',20000,0,"偷窃"));
  1. 筛选两个部门的最高工资的员工信息。
    新建一个对象Topperformer
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Topperformer {
    private String name;
    private double money;//月薪
}
// 1、开发1部的最高工资的员工
//指定大小规则
Topperformer t = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
		.map(e -> new Topperformer(e.getName(), e.getSalary() + e.getBonus())).get();
// 2、开发2部的最高工资信息
// 1)先用max定义规则,比较大小;2)用map进行加工
Topperformer t2 = two.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
		.map(e -> new Topperformer(e.getName(), e.getSalary() + e.getBonus())).get();
  1. 统计2个部门的平均月收入,去掉最高工资和最低工资。
//开发1部
one.stream().sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus())).
		skip(1).limit(one.size()-2).forEach(e->{
			//求出总和:剩余员工的工资总和
			allMoney += e.getBonus()+e.getSalary();
		});
System.out.println("开发1部的平均工资是" +allMoney/(one.size()-2));
//开发2部
two.stream().sorted((e1,e2)->Double.compare(e1.getSalary()+e1.getBonus(),e2.getSalary()+e2.getBonus()))
		.skip(1).limit(two.size()-2).forEach(employee -> {
			allMoney2 += employee.getSalary()+employee.getBonus();
		});
System.out.println("开发2的平均月收入是"+allMoney2);
  1. 统计两个部门的整体平均工资
Stream<Employee> s1 = one.stream();
Stream<Employee> s2 = two.stream();
Stream<Employee> s3 = Stream.concat(s1, s2);
s3.sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
		.skip(1).limit(one.size()+two.size()-2).forEach(e ->{
		allMoney3 += e.getSalary()+e.getBonus();
		});
BigDecimal a = BigDecimal.valueOf(allMoney3);
BigDecimal b = BigDecimal.valueOf(one.size()+ two.size()-2);
System.out.println("2个部门的整体平均工资是" +a.divide(b,2, RoundingMode.HALF_UP));

整体代码:

package stream_test;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class StreamDemo1 {
    public static  double allMoney;
    public static  double allMoney2;
    public static  double allMoney3;
    public static void main(String[] args) {
        List<Employee> one = new ArrayList<>();
        one.add(new Employee("猪八戒",'男',30000,25000,null));
        one.add(new Employee("孙悟空",'男',25000,1000,"迟到"));
        one.add(new Employee("沙僧",'男',2000,20000,null));
        one.add(new Employee("小白龙",'男',20000,25000,null));

        List<Employee> two = new ArrayList<>();
        two.add(new Employee("武松",'男',15000,9000,null));
        two.add(new Employee("李逵",'男',25000,10000,null));
        two.add(new Employee("西门庆",'男',50000,10000,"迟到"));
        two.add(new Employee("潘金莲",'女',3500,1000,"打人"));
        two.add(new Employee("武大郎",'女',20000,0,"偷窃"));

        // 1、开发1部的最高工资的员工
        //指定大小规则
//        Employee employee = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
//                .get();

        Topperformer t = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
                .map(e -> new Topperformer(e.getName(), e.getSalary() + e.getBonus())).get();
        System.out.println(t);

        // 3-2、开发2部的最高工资信息
        // 1)先用max定义规则,比较大小;2)用map进行加工
        Topperformer topperformer = two.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
                .map(e -> new Topperformer(e.getName(), e.getSalary() + e.getBonus())).get();
        System.out.println(topperformer);
        // 不能在main方法中定义一个局部变量供main方法中的foreach循环使用。
        // 因为main方法和foreach属于不同的方法栈,在不同的栈里面跑,互相不能访问。
        // 解决办法:共享变量:所有变量都可以访问,属于类
        // 2、统计平均工资,去掉最高工资和最低工资  e1在前就是升序,e2在前就是降序
        one.stream().sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus())).
                skip(1).limit(one.size()-2).forEach(e->{
                    //求出总和:剩余员工的工资总和
                    allMoney += e.getBonus()+e.getSalary();
                });
        System.out.println("开发1部的平均工资是" +allMoney/(one.size()-2));

        // 4-2、开发2部的平均月收入,去掉最高和最低工资。
        two.stream().sorted((e1,e2)->Double.compare(e1.getSalary()+e1.getBonus(),e2.getSalary()+e2.getBonus()))
                .skip(1).limit(two.size()-2).forEach(employee -> {
                    allMoney2 += employee.getSalary()+employee.getBonus();
                });
        System.out.println("开发2的平均月收入是"+allMoney2);
        // 3、合并2个集合流
        Stream<Employee> s1 = one.stream();
        Stream<Employee> s2 = two.stream();
        Stream<Employee> s3 = Stream.concat(s1, s2);
        s3.sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))
                .skip(1).limit(one.size()+two.size()-2).forEach(e ->{
                                allMoney3 += e.getSalary()+e.getBonus();
                });
        BigDecimal a = BigDecimal.valueOf(allMoney3);
        BigDecimal b = BigDecimal.valueOf(one.size()+ two.size()-2);
        System.out.println("2个部门的整体平均工资是" +a.divide(b,2, RoundingMode.HALF_UP));
    }
}

5 Stream流的收集操作

  • 收集Stream流的含义:把Stream流操作后的结果数据转回到集合或者数组中去。流只能使用一次。
  • Stream流:方便操作集合/数组的手段。
  • 集合/数组:才是开发中的目的。

Stream流体系文章来源地址https://www.toymoban.com/news/detail-455130.html

  • 转换成list集合
Stream<String> s1 = list.stream().filter(s ->
		s.startsWith("张")
);
//List<String>  list1 = s1.toList();  //得到不可变集合
List<String> zhangList = s1.collect(Collectors.toList());
  • 转换成set集合
Stream<String> s2 = list.stream().filter(s ->
		s.startsWith("张")
);
Set<String> zhangList2 = s2.collect(Collectors.toSet());
  • 转换成数组
Stream<String> s3 = list.stream().filter(s -> s.startsWith("张"));
// Stream<String>转换成数组时,默认转换成Object形式
// Object[] arrs  =  s3.toArray();
// 如果非要把object类型转为String类型
String[] arrs = s3.toArray(s->new String[s]);
// String[] arrs2 = s3.toArray(String[]::new);
System.out.println(arrs); //输出数组的地址
System.out.println(Arrays.toString(arrs));  //输出数组的值

到了这里,关于Stream流体系的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 注册天翼云关联地址:https://www.ctyun.cn/agent/#/invitation/10241586

    注册关联地址: https://www.ctyun.cn/agent/#/invitation/10241586 中国电信云计算公司运营的天翼云是一个运营商级别的一站式信息服务门户,为用户提供云主机、云存储、云备份、桌面云、大数据等全线产品,同时为政府、教育、金融等行业打造定制化云解决方案。     中国电信云计

    2024年02月12日
    浏览(46)
  • 谷歌浏览器地址栏不显示http或者https://www.前缀解决办法

    可能与浏览器版本有关,可参考此版本 恢复完整版域名步骤: 1.打开 chrome://flags/ 2.找到 Omnibox on-focus suggestions for the contextual Web 改成 enabled 3…根据提示 relaunch 浏览器 4.右键地址栏 5.完成,刷新浏览器 可参考 http://www.taodudu.cc/news/show-4921051.html?action=onClick

    2024年02月08日
    浏览(49)
  • ESP32-CAM 使用 MicroPython 完成视频网络服务器 (Web Video Stream)

    ESP32-CAM 是安信可发布小尺寸的摄像头模组。该模块可以作为最小系统独立工作,尺寸仅为2740.54.5mm。 ESP32-CAM可广泛应用于各种物联网场合,适用于家庭智能设备、工业无线控制、无线监控、人脸识别以及其它物联网应用,是物联网应用的理想解决方案。 ESP32-CAM采用DIP封装,

    2024年02月13日
    浏览(44)
  • 小程序 - Taro小程序中打开h5页面链接 - 并解决:无法打开该页面 - 不支持打开 https://www.baidu.com/,请在“小程序右上角更多->反馈与投诉”中和开发者反馈

    Taro 小程序中h5跳转打开页面 借助 webView 组件打开h5页面 @/pages/webView/webView.js 文件 Taro 中 webView 组件 29 行 主要代码 无法打开该页面 - 不支持打开 https://www.baidu.com/,请在“小程序右上角更多-反馈与投诉”中和开发者反馈 解决 - 在微信公众平台 小程序进行业务域名配置 具体

    2024年02月09日
    浏览(41)
  • unable to access ‘https://github.com/***/‘: HTTP/2 stream 1 was not closed cleanly before end

    错误提示: 错误原因: 当前git的网络协议和github要求的不一致; 解决方法: 执行上面指令后: .gitconfig中添加了http/1.1的协议,再提交试试;

    2024年02月03日
    浏览(43)
  • AI 视频 | Stable Video Diffusion 来了!(附体验地址)

    11 月 21 日,Stability AI 推出了 Stable Video Diffusion,这是 Stability AI 的第一个基于图像模型 Stable Diffusion 的生成式视频基础模型。 目前 Stability AI 已经在 GitHub 上开源了 Stable Video Diffusion 的代码,在 Hugging Face 上也可以找到模型本地运行所需要的 weights。 「GitHub」 https://github.com/

    2024年02月04日
    浏览(87)
  • vue2 使用 vue-video-player 播放m3u8 流地址视频

    安装插件  : 注意需要引入  videojs-contrib-hls ,否则无法播放hls流文件  main.js 引入 代码内引入: 注意点:    1.type: \\\'application/x-mpegURL\\\' ,否则无法播放流文件  2.aspectRatio: \\\'16:9\\\',  宽高比需要进行设置, 若没有进行设置,会出现黑边过高或者过宽的问题 常用API方法:

    2024年02月07日
    浏览(50)
  • OpenAI API(ChatGPT)接口地址https://api.openai.com/v1/chat网络问题无法访问Error: connect ECONNREFUSED ETIMEDOUT

    https://api.openai.com/v1/chat是openAI的API接口地址,因为长城的原因,23年年初一次更新后便无法访问,访问接口会提示Error: connect ETIMEDOUT等网络相关的问题。 解决办法有三种: 本文只做方法讨论,供读者自行研究。如需实际的解决方案,请联系我 1. 代理(适用于大型的场景) 在

    2023年04月18日
    浏览(154)
  • nginx将xxx.com重定向到www.xxx.com配置

    有时候,我们网站,需要将顶级域名xxx.com统一跳转到二级域名www.xxx.com下。这时候,我们可以通过修改nginx配置达到我们的目的。

    2024年03月23日
    浏览(56)
  • Docker未授权访问漏洞(www.hetianlab.com)

    Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。 产生原因 如果在docker上配置了远程访问,d

    2024年02月04日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包