Java Stream流1

news2024/12/23 11:09:01

目录

    • 1 Stream流
      • 1.1 Stream流的生成方式
      • 1.2 Stream流中间操作之 filter
      • 1.3 Stream流中间操作之 limit 和 skip
      • 1.4 Stream流中间操作之 concat 和 distinct

1 Stream流

  • 体验Stream流
  • 需求
    在这里插入图片描述
package test;


import java.lang.reflect.Array;
import java.util.ArrayList;

public class Demo {
    public static void main(String[] args) {
        //创建集合,储存多个字符
        ArrayList<String> list = new ArrayList<>();

        list.add("小黑");
        list.add("张无忌");
        list.add("大熊猫");
        list.add("张天峰");
        list.add("小白");
        list.add("张飞");

        //把集合中所有以“张”开头的数据存储到新的集合
        ArrayList<String> zhanglist = new ArrayList<>();
        for(String s:list) {
            if(s.startsWith("张")) {
                zhanglist.add(s);
            }
        }

//        System.out.println(zhanglist); //[张无忌, 张天峰, 张飞]

        //把"张“开头长度为3的存到新集合
        ArrayList<String> threelist = new ArrayList<>();
        for(String s:zhanglist) {
            if(s.length()==3) {
                threelist.add(s);
            }
        }

        for(String s:threelist) {
            System.out.println(s);
//            张无忌
//            张天峰
        }

        //Stream流
        list.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3);
//            张无忌
//            张天峰
    }
}
  • 使用Stream流的方式完成过滤操作
  • list.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3);
  • 直接阅读代码的字面意思即可完美展示无关逻辑方式的语义: 生成流、过滤姓张、过滤长度为3、逐一打印
  • Stream流把真正的函数式编程风格引入到Java中

1.1 Stream流的生成方式

  • Stream流的常见生成方式
    • 1、Collection体系的集合可以使用默认方法stream()生成流:default Stream<E> stream()
    • 2、Map体系的集合间接的生成流
    • 3、数组可以通过Stream接口的静态方法生成流:of (T... values)
package test;


import java.util.*;
import java.util.stream.Stream;

public class Demo {
    public static void main(String[] args) {
        //1、Collection体系的集合可以使用默认方法stream()生成流:default Stream<E> stream()
        List<String> list = new ArrayList<>();
        Stream<String> listStream = list.stream();

        Set<String> set = new HashSet<>();
        Stream<String> setStream = set.stream();

        //2、Map体系的集合间接的生成流
        Map<String,Integer> map = new HashMap<>();
        Stream<String> keyStream = map.keySet().stream(); //KeySet()方法得到一个Set集合
        Stream<Integer> valueStream = map.values().stream();
        Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();

        //3、数组可以通过Stream接口的静态方法生成流:of (T... values)
        String[] strArray = {"java","python","scala"};
        Stream<String> strArrayStream1 = Stream.of(strArray);
        Stream<String> strArrayStream2 = Stream.of("java","python");
        Stream<Integer> integerStream = Stream.of(10, 20, 30);
    }
}
  • Stream流的使用方法
方法名说明
list.stream()生成流:通过数据源(集合,数组等)生成流
filter()中间操作:一个流后面可以跟随零个或多个中间操作, 其目的主要是打开流,做出某种程度的数据过滤映射,然后返回一个新的流,交给下一个操作使用
forEach()终结操作:一个流只能有一个终结操作,当这个操作执行后,流就被使用“光" 了,无法再被操作。所以这必定是流的最后一个操作

1.2 Stream流中间操作之 filter

  • Stream<T> filter(Predicate predicate):用于对流中的数据进行过滤

  • Predicate接口中的方法boolean test(T t):対给定的参数迸行判断,返回一个布尓值

  • 范例

package test;

import java.util.ArrayList;

public class Demo {
    public static void main(String[] args) {
        //创建一个集合存储多个元素
        ArrayList<String> list = new ArrayList<>();

        list.add("小黑");
        list.add("张无忌");
        list.add("大熊猫");
        list.add("张天峰");
        list.add("小白");
        list.add("张飞");

        //需要1:把list集合中以张开头的在控制台输出
        list.stream().filter(s -> s.startsWith("张")).forEach(System.out::println);
        System.out.println("--------");
//        张无忌
//        张天峰
//        张飞

        //需要2:把list集合中长度为3的元素输出
        list.stream().filter(s -> s.length() == 3).forEach(System.out::println);
        System.out.println("--------");
//        张无忌
//        大熊猫
//        张天峰

        //需求3:把以张开头,长度为3的在控制台输出
        list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(System.out::println);
//        张无忌
//        张天峰
    }
}

1.3 Stream流中间操作之 limit 和 skip

  • Stream<T> limit(long maxSize):返回此流中的元素组成的流,截取前指定参数个数的数据
  • Stream<T> skip(long n):跳过指定参数个数的数据,返回由该流的剩余元素组成的流
  • 范例:
package test;

import java.util.ArrayList;

public class Demo {
    public static void main(String[] args) {
        //创建一个集合存储多个元素
        ArrayList<String> list = new ArrayList<>();

        list.add("小黑");
        list.add("张无忌");
        list.add("大熊猫");
        list.add("张天峰");
        list.add("小白");
        list.add("张飞");

        //需要1:取前三个数据在控制台输出
        list.stream().limit(3).forEach(System.out::println);
        System.out.println("---------");
//        小黑
//        张无忌
//        大熊猫

        //需求2:跳过3个元素,把剩下的在控制台输出
        list.stream().skip(3).forEach(System.out::println);
        System.out.println("---------");
//        张天峰
//        小白
//        张飞

        //需求3:跳过2个元素,把剩下元素的前两个输出
        list.stream().skip(2).limit(2).forEach(System.out::println);
//        大熊猫
//        张天峰
    }
}

1.4 Stream流中间操作之 concat 和 distinct

  • static <T> Stream<T> concat(Stream а, Stream b):合并a和b两个流为一个流

  • Stream<T> distinct():返回由该流的不同元素(根据Object.equals(Object)) 组成的流

  • 范例:

package test;

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

public class Demo {
    public static void main(String[] args) {
        //创建一个集合存储多个元素
        ArrayList<String> list = new ArrayList<>();

        list.add("小黑");
        list.add("张无忌");
        list.add("大熊猫");
        list.add("张天峰");
        list.add("小白");
        list.add("张飞");

        //需要1:取前4个数据组成一个流
        Stream<String> s1 = list.stream().limit(4);

        //需求2:跳过2个数据组成一个流
        Stream<String> s2 = list.stream().skip(2);

        //需求3:合并1,2结果得到的流,并输出
//        Stream.concat(s1,s2).forEach(System.out::println);
//        小黑
//        张无忌
//        大熊猫
//        张天峰
//        大熊猫
//        张天峰
//        小白
//        张飞

        //需求4:合并1,2结果得到的流,并输出,要求结果不重复
        Stream.concat(s1, s2).distinct().forEach(System.out::println);
//        小黑
//        张无忌
//        大熊猫
//        张天峰
//        小白
//        张飞
    }
}

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

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

相关文章

Arduino IDE搭建Heltec开发板开发环境

Arduino IDE搭建Heltec开发板开发环境Heltec开发板开发环境下载与搭建Arduino IDE下载与安装搭建Heltec开发板的开发环境添加package URL方法通过Git的方法安装离线安装Heltec开发板开发环境下载与搭建 Arduino IDE下载与安装 Heltec的ESP系列和大部分的LoRa系列开发板都是用A…

2.Gin内容介绍

目录 参考 主要内容 关于Web 创建项目 为什么要用框架 Gin框架介绍 Gin框架安装与使用 安装 第一个Gin示例&#xff1a; RESTful API Gin渲染 HTML渲染 自定义模板函数 静态文件处理 使用模板继承 补充文件路径处理 JSON渲染 XML渲染 YMAL渲染 protobuf渲染…

【Java基础 下】 024 -- 集合进阶(双列集合、HashMap、LinkedHashMap、TreeMap、Collections)

学习内容&#xff1a; 目录 一、双列集合 1、双列集合的特点 2、双列集合的常见API 示例代码 3、Map的遍历方式 ①、第一种遍历方式&#xff1a;键找值&#xff08;keySet&#xff09; ②、第二种遍历方式&#xff1a;键值对&#xff08;entrySet&#xff09; ③、第三种遍历方…

LeetCode 周赛 333,你管这叫 Medium 难度?

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 提问。 大家好&#xff0c;我是小彭。 上周是 LeetCode 第 333 场周赛&#xff0c;你参加了吗&#xff1f;这场周赛质量很高&#xff0c;但难度标得不对&#xff0c;我真的会谢。算法…

深度学习在视频多目标跟踪中的应用综述

文章目录摘要1、简介2、MOT:算法、指标和数据集2.1、MOT算法简介2.2、指标经典的指标完整的MOT指标ID 分数2.3、基准数据集3、MOT中的深度学习3.1、深度学习中的检测步骤3.1.1、Faster R-CNN3.1.2、SSD3.1.3、Other detectors3.1.4、cnn在检测步骤中的其他用途3.2、深度学习在特…

Git的常用命令

1&#xff1a;软件安装1.1&#xff1a;Git下载与安装百度上搜索Git官网&#xff1a;https://git-scm.com/下载&#xff1a;https://git-scm.com/download/win下载Git安装程序&#xff0c;双击安装 Git-2.9.3.2-64-bit.exe配置环境变量path 使用git --version查看 git 是否安装成…

儿童袖套上架美国亚马逊CPC认证

袖套&#xff0c;也称套袖。是戴在袖管外的套子&#xff0c;旨在保护衣服的袖管。通常戴时松垂于另外一只衣袖外面的袖子。美国CPC认证简介&#xff1a;CPC认证是Children’s Product Certificate的英文简称&#xff0c;CPC证书就类似于国内的质检报告&#xff0c;在通过相关检…

(十七)docker安装RocketMQ

一、简介 操作系统&#xff1a;Linux CentOS 7.3 64位 docker版本&#xff1a;19.03.8 RocketMQ版本&#xff1a;4.3.2 二、实践 1、拉取镜像 docker pull rocketmqinc/rocketmq:4.3.2 2、运行容器 我们先搭建namesrv(Name Server)服务。 它充当路由消息的提供者&#…

vue2提取vue-router的title单独存放,使用i18n实现

成品效果 首先引入i18n(vue-i18n官网文档) 依赖包 npm install vue-i18n8然后单独在src目录下新建一个文件夹lang&#xff0c;存放相对应的变量名称&#xff0c;我这里只做显示中文所以其他引入我都注释了&#xff0c;具体目录如下&#xff1a; src\lang/zh.js部分代码 export…

记一次:request请求总结

前言&#xff1a;和前端联调的时候发现前端人员请求的方式不对&#xff0c;固做此总结问题&#xff1a;request请求方式有多少种&#xff1f;答&#xff1a;Java后端查看有8种&#xff0c;spring-web中的java枚举图如下而使用PostMan查看有15种&#xff0c;如下图GET&#xff0…

前端页面jquery规范写法

使用最新版本的 jQuery 最新版本的 jQuery 会改进性能和增加新功能,若不是为了兼容旧浏览器,建议使用最新版本的 jQuery。以下是三条常见的 jQuery 语句,版本越新,性能越好: $(.elem) $(.elem, context) context.find(.elem) 结果 1.6.2 版执行次数远超两个老版本。 jQ…

eclipse中整理左侧项目栏文件

&#x1f4a1;在使用eclipse的过程中&#xff0c;随着项目越来越多&#xff0c;会使得项目管理变得困难&#xff0c;介绍一下eclipse中对于项目分类存放&#xff08;Java Working Set&#xff09;的解决方案。如果按照默认的方式查看项目列表是这种效果:⭕当创建使用小项目过多…

Prometheus+Grafana监控

1、简介1.1 Prometheus官网地址&#xff1a;https://prometheus.io/Prometheus是一个开源的监控系统&#xff0c;起源于SoundCloud。它由以下几个核心组件构成&#xff1a;数据爬虫&#xff1a; 根据配置的时间定期的通过HTTP抓去metrics数据。time-series 数据库&#xff1a; …

Ubantu 安装到VMware详解

想要在VMware中运行Linux系统&#xff0c;那么就需要Linux系统安装到VMware虚拟机上面。在这里&#xff0c;以把ubantu16.04安装到VMware虚拟机中为教程进行图文讲解&#xff0c;共分为三个步骤&#xff0c;分别是创建新的虚拟机、安装到ubantu系统、安装VMware Tools。 1.1 创…

响应式网络建站公司网站源码+完整教程

分享一个开源的自适应的三网合一的网络建站公司网站的完整源码&#xff0c;当做互联网公司官网特别合适&#xff0c;带完整搭建教程。此款网站源码适用于小程序制作公司、网络公司、网站建设公司等等&#xff0c;这些都可以用这个网站模板&#xff0c;网站整体非常高端大气&…

vue+vite项目部署会遇到的几个问题

今天来打包硅谷外卖项目&#xff0c;通过解决项目中遇到的问题来加深对vite打包的理解。 运行yarn build 报错,报[WARNING] Expected identifier but found “*” [css-syntax-error] 既然zoom:1是没有变化&#xff0c;直接把它去掉即可。 然后继续yarn build 不出所料还是报…

有序表的应用:设计一个增、删、查数据的时间复杂度均为O(logN)的结构

1、题目描述 设计一个结构包含如下三个方法&#xff1a; void add(int index, int num); //把num加入到index位置 int get(int index); //取出index位置的值&#xff08;是自然序的index位置&#xff0c;非排序后&#xff09; void remove(int index); //把index位置上的值删…

【Linux】vim拒绝服务安全漏洞修复

根据国家信息安全漏洞共享平台于2023年2月19日发布的安全漏洞通知&#xff0c;Linux系统自带的vim编辑器存在两个高危安全漏洞&#xff08;CNVD-2023-09166、CNVD-2023-09647&#xff09;&#xff0c;攻击者可以利用该漏洞发起拒绝服务攻击&#xff0c;并可能运行&#xff08;恶…

【编程入门】应用市场(Vue版)

背景 前面已输出多个系列&#xff1a; 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 《N种编程语言做个记事本》 目标 为编程初学者打造入门学习项目&#xff0c;使…

双因素方差分析

一、案例与数据 一家大型商业银行在多地区设有分行&#xff0c;其业务主要是进行基础设施建设&#xff0c;国家重点项目建设&#xff0c;固定资产投资等项目的贷款。近年来&#xff0c;该银行的贷款额平稳增长&#xff0c;但不良贷款额也有较大比例的提高&#xff0c;这给银行…