Java的Stream流【详解】

news2025/1/2 2:44:38

        

目录

        

一.概念

二.Stream流处理数据的步骤

        1.得到集合或者数组的Stream流。

2.调用Stream流的中间方法对数据进行处理

3.调用Stream流的终结方法获取处理的结果

一.概念

        是Jdk8开始新增的一套API (java.util.stream.*),可以用于操作集合或者数组的数据。

好处:

       Stream流大量的结合了Lambda的语法风格来编程,提供了一种更加强大,更加简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好。

二.Stream流处理数据的步骤

        1.得到集合或者数组的Stream流。

                获取集合对象的Stream流:default Stream<E> stream​()

                获取数组对象的Stream流:

                        Arrays类提供的静态方法 public static <T> Stream<T> stream(T[] array)

                        Stream类提供的静态方法   public static<T> Stream<T> of(T... values)

        

package com.itheima.day08.teacher.stream;

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

public class StreamDemo01 {
    /*
      掌握
         如何获取 List的Stream流
         如何获取 Set的Stream流
             单列集合对象.stream()

         如何获取 Map的Stream流
             变成单列之后 在 .stream()

         如果获取 数组的Stream流
             Arrays.stream(数组)
             Stream.of(数组)
         将集合中的数据放到流水线上。
     */
    public static void main(String[] args) {
        //1 List的Stream流
        List<String> names = new ArrayList<>();
        Collections.addAll(names,"蔡徐坤","小黑子","ikun","鸡你太美");
        // 数据转换到流上
        Stream<String> stream1 = names.stream();

        //2 Set的Stream流
        Set<String> set = new HashSet<>();
        Collections.addAll(set,"蔡徐坤","小黑子","ikun","鸡你太美");
        // 数据转换到流上
        Stream<String> stream2 = names.stream();

        //3:如何获取 Map的Stream流
        Map<String,Integer> map = new HashMap<>();
        map.put("姚明",40);
        map.put("刘翔",42);
        map.put("郭敬明",44);
        // 键集 转换成Stream流
        Stream<String> stream31 = map.keySet().stream();
        // 值集 转换成Stream流
        Stream<Integer> stream32 = map.values().stream();

        //处理键值对呢? 键值对对象 叫entry
        Stream<Map.Entry<String, Integer>> stream3 = map.entrySet().stream();


        //4:数组 的Stream流
        String[] array = {"蔡徐坤","小黑子","ikun","鸡你太美"};
        //两种方式
        Stream<String> stream4 = Arrays.stream(array);
        Stream<String> stream5 = Stream.of(array);
    }
}
2.调用Stream流的中间方法对数据进行处理

        中间方法调用完成后会返回新的Stream流,可以继续使用(支持链式编程)

package com.itheima.day08.teacher.stream;

import java.util.stream.Stream;

public class StreamDemo02 {
    /*
     学习Stream流的中间方法
     */
    public static void main(String[] args) {
        //将多个数据放到流水线上 形成新的Stream流
        Stream<String> stream1 = Stream.of("a", "b", "c", "d", "e", "f", "g");
        // limit(long n)流水线上取出前n个元素..形成一个新的流向  旧的流向已经关闭 (永不回头)
//        Stream<String> limit = stream1.limit(3);
        // forEach(写处理每个数据的lambda表达式)
        // lambda ()->{}
        System.out.println("=================limit 取前几个======================");
        stream1.limit(3).forEach(s-> System.out.println(s));

        // forEach() 终结方法 从流水线上下来了。
        //============================
        System.out.println("=================skip跳过======================");
        Stream<String> stream2 = Stream.of("a", "b", "c", "d", "e", "f", "g");
        //跳过
        stream2.skip(4).forEach(s -> System.out.println(s));

        System.out.println("=============distinct去重==========================");
        Stream<String> stream3 = Stream.of("a", "b", "a", "d", "b", "b", "g");
        //终结方法
//        System.out.println(stream3.count());
//        stream3.skip(3); 报错 原因 count()终结
        long count = stream3.distinct().count();
        System.out.println("去重之后还有几个数据:"+count);

        System.out.println("============sorted排序=================");
        Stream<Integer> stream4 = Stream.of(911,119,111,114,110);
        stream4.sorted().forEach(s-> System.out.println(s));//默认排序
        System.out.println("============sorted排序 自定义排序规则=================");
        Stream<Integer> stream5 = Stream.of(911,119,111,114,110);
        stream5.sorted((o1,o2)->o2-o1).forEach(s-> System.out.println(s));//默认排序
    }
}



----------------
package com.itheima.day08.teacher.stream;

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

public class StreamDemo03 {
    /*
       学会使用Stream流的中间方法
     */
    public static void main(String[] args) {
        List<Double> scores = new ArrayList<>();
        Collections.addAll(scores, 88.5, 100.0, 50.0);

        // sorted 排序  排序的规则  两个数据比较 (o1,o2)->{比较的规则}
        // sorted((o1,o2)->{排序的规则})  sorted() 默认规则
        // forEach(完成数据的遍历)  每次取出来每一个元素
        // forEach((s)->{处理s})

        // filter是过滤的功能  找出符合要求的数据 返回的结果是boolean
        // filter((s)->{return 判断语句;})
        // filter(s->判断语句)
        // 找出成绩大于等于60分的数据,并升序后,再输出。
        scores.stream().filter(s->s>=60).sorted().forEach(System.out::println);

        // map 一一映射  转换的意思
        // 将流中的Double类型数据 变成字符串类型
//        Stream<Double> stream = scores.stream(); 流里面是 Double类型元素
        // map 将A 类型 转换成  B类型
        //      Double---String
        // map((A s)->{return B类型;})
        // map(A类型参数->B类型数据)
//        Stream<String> stringStream = scores.stream().map((Double d) -> {
//            return d + "哈哈";
//        });

        Stream<String> stringStream = scores.stream().map( d ->  d + "哈哈");

        // Double类型 变成学生类型
//         scores.stream().map((Double s)->{返回 学生对象})
//        Stream<Student> studentStream = scores.stream().map((Double s) -> {
//            return new Student("小明", 18, s);
//        });

        Stream<Student> studentStream = scores.stream().map( s->  new Student("小明", 18, s));
         //苍穹外卖 项目后期 可以使用map进行类型转换。

        //合并流
        Stream<String> stream1 = Stream.of("a", "b", "c");
        Stream<String> stream2 = Stream.of("1", "2", "3");

        Stream<String> stream = Stream.concat(stream1, stream2);
        //两个流合并到一个流上了。
    }
}
3.调用Stream流的终结方法获取处理的结果

        终结方法调用完成后,不会返回新Stream了,不能继续使用流了

       

代码演示:



package com.itheima.day08.teacher.stream;

/**
 * 学生类
 */
public class Student {

    private String name;
    private int age;
    private double score;

    public Student() {
    }

    public Student(String name, int age, double score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取
     * @return score
     */
    public double getScore() {
        return score;
    }

    /**
     * 设置
     * @param score
     */
    public void setScore(double score) {
        this.score = score;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + ", score = " + score + "}";
    }
}



--------------
package com.itheima.day08.teacher.stream;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

public class StreamDemo04 {
    /*
       学会使用Stream流的终结方法
     */
    public static void main(String[] args) {
        List<Double> scores = new ArrayList<>();
        Collections.addAll(scores, 88.5, 100.0, 50.0);

        System.out.println(scores.stream().count());//求出该流中数据的个数
        scores.stream().forEach(s-> System.out.println(s));//对流中数据进行处理--输出
        System.out.println("===========求最大值==============");
        Double max = scores.stream().max((o1, o2) -> Double.compare(o2, o1)).get(); //按照正常前后顺序才能找到,翻过会找到最小值
//        Double max = scores.stream().max(Double::compare).get();
        Double min = scores.stream().min((o1, o2) -> Double.compare(o1, o2)).get();
        System.out.println(max);
        System.out.println(min);

        List<Student> students = new ArrayList<>();
        students.add(new Student("小明",28,1.67));
        students.add(new Student("小李",26,1.98));
        students.add(new Student("小王",27,1.99));
        //求出身高最高的哪位同志
//        Student student = students.stream().max((o1, o2) -> Double.compare(o1.getScore(), o2.getScore())).get();
        Student student = students.stream().max((o1, o2) -> Double.compare(o1.getScore(), o2.getScore())).get();
        System.out.println(student);
    }
}



------------------
package com.itheima.day08.teacher.stream;

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

public class StreamTest01 {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("张歆艺");
        list.add("周杰伦");
        list.add("赵雷");
        list.add("张译");
        list.add("张学友");

        //把集合中所有以 张开头  且3个字的元素存储到新的集合中
        List<String> newList = new ArrayList<>();
        for (String name : list) {
            if(name.startsWith("张") && name.length()==3){
                newList.add(name);
            }
        }
        System.out.println(newList);

        // 将集合数据放到流水线上  进行 一步步的操作
        List<String> newList2 = list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).collect(Collectors.toList());

        System.out.println(newList2);
    }

}

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

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

相关文章

【卷积神经网络中用1*1 卷积有什么作用或者好处呢?】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;深度学习 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 1*1 卷积有什么作用或者好处呢 作用降维和增加非线性特征组合和交互网络的宽度和深度调整全连接替代增强…

vue2的ElementUI的form表单报错“Error: [ElementForm]unpected width”修复

1. 问题 ElementUI的form表单&#xff0c;当动态切换显示表单时报错 Error: [ElementForm]unpected width。 翻译过来就是form表单的label宽度width出了问题。 2. 分析 参数说明类型可选值默认值label-width表单域标签的宽度&#xff0c;例如 ‘50px’。作为 Form 直接子元…

2024-02-20(DataX,Spark)

1.Oracle利用DataX工具导出数据到Mysql。Oracle利用DataX工具导出数据到HDFS。 只是根据导入导出的目的地不同&#xff0c;DataX的Json文件书写内容有所不同。万变不离其宗。 书写的Json格式的导入导出规则文件存放再Job目录下的。 2.Spark概念 Apache Spark是用于大规模数…

将yolov8权重文件转为onnx格式并在c#中使用

yolo模型转ONNX 在yolov8中&#xff0c;我们将训练结果的.pt权重文件转换为onnx格式只需要使用ultralytics库中的YOLO类&#xff0c;使用pip安装ultralytics库&#xff0c;然后执行下面python代码 from ultralytics import YOLO# 加载YOLOv8模型 model YOLO("best.pt&q…

智能家居界面:移动、pad端、电脑端、HMI端都有,比较多。

Hi&#xff0c;大家好&#xff0c;我是大千UI工场&#xff0c;本篇纯分享智能家居的各类终端界面&#xff0c;关注本头条号&#xff0c;每天带你看一样的UI作品。 智能家居界面可以通过手机应用程序、智能音箱的语音助手、智能电视等设备上的应用程序来实现。通过智能家居界面…

Java - @JSONField和@JsonProperty注解

JSONField注解是阿里巴巴的fastjson框架中的注解&#xff0c;用于指定JSON字符串中的属性名和Java对象中的属性名之间的映射关系 JsonProperty注解是Jackson框架中的注解&#xff0c;用法类似于JSONField&#xff0c;也是指定JSON字符串中的属性名和Java对象中的属性名之间的映…

爬虫知识--02

免费代理池搭建 # 代理有免费和收费代理 # 代理有http代理和https代理 # 匿名度&#xff1a; 高匿&#xff1a;隐藏访问者ip 透明&#xff1a;服务端能拿到访问者ip 作为后端&#xff0c;如何拿到使用代理人的ip 请求头中&#xff1a;x-forwor…

【Python爬虫】requests库get和post方法使用

requests库是一个常用于http请求的模块&#xff0c;性质是和urllib&#xff0c;urllib2是一样的&#xff0c;作用就是向指定目标网站的后台服务器发起请求&#xff0c;并接收服务器返回的响应内容。 1. 安装requests库 使用pip install requests安装 如果再使用pip安装python…

Fiddler工具 — 18.Fiddler抓包HTTPS请求(一)

1、Fiddler抓取HTTPS过程 第一步&#xff1a;Fiddler截获客户端发送给服务器的HTTPS请求&#xff0c;Fiddler伪装成客户端向服务器发送请求进行握手 。 第二步&#xff1a;服务器发回相应&#xff0c;Fiddler获取到服务器的CA证书&#xff0c; 用根证书&#xff08;这里的根证…

Android 浅色皮肤阴影开发

前言&#xff1a;项目中要进行浅色皮肤开发&#xff0c;然后要求要有阴影效果&#xff0c;下面是UI觉得可行的中立方案效果 尝试一、使用elevation添加阴影发现效果一般 尝试二、使用带阴影的UI切图后续发现成本太大&#xff0c;对后续多个皮肤适配要求太大 尝试三、使用elevat…

oppo手机如何录屏?解锁录屏新功能!

“最近换了一款oppo手机&#xff0c;感觉它的拍照功能真的很强大。但除此之外&#xff0c;我发现oppo还有许多隐藏功能&#xff0c;比如录屏。但我尝试了很久&#xff0c;都没找到录屏的开关在哪里。有没有哪位oppo用户知道怎么打开这个功能呢&#xff1f;” 随着科技的不断发…

【小样本命名实体识别】COPNER论文源码详解

COPNER: Contrastive Learning with Prompt Guiding for Few-shot Named Entity Recognition 原文与代码链接&#xff1a; https://github.com/AndrewHYC/COPNER 一、项目结构 二、代码分析 1.定义参数 配置训练环境 parser.add_argument(--gpu, default0,helpthe gpu num…

Spring最新核心高频面试题(持续更新)

1 什么是Spring框架 Spring框架是一个开源的Java应用程序开发框架&#xff0c;它提供了很多工具和功能&#xff0c;可以帮助开发者更快地构建企业级应用程序。通过使用Spring框架&#xff0c;开发者可以更加轻松地开发Java应用程序&#xff0c;并且可以更加灵活地组织和管理应…

js设计模式:原型模式

作用: 使用js特有的原型链机制,可以通过Object.create方法创建新对象,将一个对象作为另外一个对象的原型 也可以通过修改原型链上的属性,影响新对象的行为 可以更方便的创建一些对象 示例: let obj {getName: function(){return this.name},getAge:function(){return this…

Python学习-用Python设计第一个游戏

三、用Python设计第一个游戏 1、新建文件 使用IDLE的编辑器模式&#xff0c;新建一个文件&#xff0c;点击File—>New File 2、将下面的游戏代码敲入进去 """用Python设计第一个游戏"""temp input("不妨猜一下小甲鱼现在心里想的是…

Excel练习:双层图表

Excel练习&#xff1a;双层图表 学习视频Excel制作双层图表&#xff0c;很多人都不会&#xff0c;其实只需1步操作就够了&#xff01;_哔哩哔哩_bilibili ​​ 通过调整两个图形的显示范围实现 增加折现图的负数显示范围&#xff0c;使折现图仅出现在整体图形的上方增加柱形…

ABAQUS应用04——集中质量的添加方法

文章目录 0. 背景1. 集中质量的编辑2. 约束的设置3. 总结 0. 背景 混塔ABAQUS模型中&#xff0c;机头、法兰等集中质量的设置是模型建立过程中的一部分&#xff0c;需要研究集中质量的添加。 1. 集中质量的编辑 集中质量本身的编辑没什么难度&#xff0c;我已经用Python代码…

快速上手Spring Boot整合,开发出优雅可靠的Web应用!

SpringBoot 1&#xff0c;SpringBoot简介1.1 SpringBoot快速入门1.1.1 开发步骤1.1.1.1 创建新模块1.1.1.2 创建 Controller1.1.1.3 启动服务器1.1.1.4 进行测试 1.1.2 对比1.1.3 官网构建工程1.1.3.1 进入SpringBoot官网1.1.3.2 选择依赖1.1.3.3 生成工程 1.1.4 SpringBoot工程…

7款自媒体写作神器:让内容创作更高效! #经验分享#人工智能#媒体

这些宝藏AI 写作神器&#xff0c;我不允许你还不知道~国内外免费付费都有&#xff0c;还有AI写作小程序分享&#xff0c;大幅度提高写文章、写报告的效率&#xff0c;快来一起试试吧&#xff01; 1.飞鸟写作 这是一个微信公众号 面向专业写作领域的ai写作工具&#xff0c;写作…

Qt的跨平台开发

自从最初发布以来&#xff0c;Qt就以其跨平台的能力而闻名——这是创建这个框架背后的主要愿景。您可以在自己喜欢的桌面平台(如Windows、Linux和mac OS)上使用Qt Creator&#xff0c;并使用相同的代码库或稍加修改&#xff0c;创建流畅、现代、触摸友好的图形用户界面(GUI)和桌…