首页 > 其他分享 >Stream流操作

Stream流操作

时间:2024-09-18 18:48:30浏览次数:3  
标签:return Stream System visual basic 操作 out

   准备工作

准备 Gender 枚举类以及 Customer 类

enum Gender {
    MALE("男性"), FEMALE("女性");
    private String value;

    Gender() {
    }

    Gender(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "Gender{" +
        "value='" + value + '\'' +
        '}';
    }
}
class Customer {
    private String name;
    private Gender gender;

    public Customer() {
    }

    public Customer(String name, Gender gender) {
        this.name = name;
        this.gender = gender;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Gender getGender() {
        return gender;
    }

    public void setGender(Gender gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Customer{" +
        "name='" + name + '\'' +
        ", gender=" + gender +
        '}';
    }
}

Stream 介绍

  • java.util.Stream表示能应用在一组元素上一次执行的操作序列。
  • Stream操作分为中间操作或者最终操作两种,最终操作返回一特定类型的计算结果,而中间操作返回Stream本身,可以连续完成多个操作。

创建 Stream 流

创建数据流的方式一

//        创建数据流方法一 使用集合.stream()
List<String> list = Arrays.asList("c", "c++", "c#", "java", "python", "go", "php", "html", "visual basic", "visual basic", "visual basic", "basic", "basic", "b");
list.stream();

创建数据流的方式二

//        创建数据流方法二 使用Stream.of()
Stream<String> stream2 = Stream.of("C", "C++", "c#", "Java", "python", "Go", "php", "html", "visual basic", "visual basic", "visual basic", "basic", "basic", "B");

常用方法

1. forEach 遍历方法

重写 Consumer 函数式接口中的 apply() 方法

List<String> list = Arrays.asList("c", "c++", "c#", "java", "python", "go", "php", "html", "visual basic", "visual basic", "visual basic", "basic", "basic", "b");
Stream<String> stream1 = list.stream();
stream1.forEach(System.out::println);
2. filter 过滤方法

按照条件过滤掉出我们需要的数据

List<String> list = Arrays.asList("c", "c++", "c#", "java", "python", "go", "php", "html", "visual basic", "visual basic", "visual basic", "basic", "basic", "b");
Stream<String> stream1 = list.stream();
stream1.filter((lang) -> {
    return lang.length() > 3;
})
.distinct()  //去重
.forEach(System.out::println);
3. sorted 排序方法

重写Comparator函数式接口中的compare()方法

Stream<String> stream2 = Stream.of("C", "C++", "c#", "Java", "python", "Go", "php", "html", "visual basic", "visual basic", "visual basic", "basic", "basic", "B");
//        获得包含大写字母的并且排序
stream2.filter((lang) -> {
    for (int i = 0; i < lang.length(); i++) {
        if (lang.charAt(i) >= 'A' && lang.charAt(i) <= 'Z') {
            return true;
        }
    }
    return false;
}).sorted((o1, o2) -> {
    int compare = o1.compareTo(o2);
    if (compare == 0) {
        return o1.length() - o2.length();
    } else {
        return compare;
    }
}).forEach((lang) -> {
    System.out.println(lang);
});
4. map 映射方法

映射 对流中的数据进行处理(加减乘除等等操作)

// 将集合中的数据每个都 +1
List<Integer> numList = Arrays.asList(90, 100, 10, 20, 30, 50, 60, 70, 80);
numList.stream().map((num) -> {
    return num + 1;
}).forEach(System.out::println);
5. match 匹配方法
  • 返回值是一个 boolean 类型
  • 重写函数式接口Predicate接口中的 test()方法
  1. allMatch()全部匹配,只有集合中的数据全部匹配我们的条件才会返回 true
List<String> strings = Arrays.asList("abc", "defs", "gkh", "abc");
boolean bool = strings.stream().allMatch((s) -> {
    return s.length() == 3;
});
System.out.println(bool);

运行结果为 false 因为有一个数据的长度是 4

  1. anyMatch()部分匹配,只要集合中的数据有一个匹配我们的条件就返回 true
List<String> strings = Arrays.asList("abc", "defs", "gkh", "abc");

boolean bool = strings.stream().anyMatch((s) -> {
    return s.length() == 3;
});
System.out.println(bool);
6. count 计数方法

用来统计个数类似于 sql中的聚合函数 count

/**
         * 计数 count()
         * 统计所有女生的数量
         */
List<Customer> customerList = Arrays.asList(
    new Customer("白骨精", Gender.FEMALE),
    new Customer("女儿国国王", Gender.FEMALE),
    new Customer("擎天柱", Gender.MALE),
    new Customer("蛇精", Gender.FEMALE),
    new Customer("金刚葫芦娃", Gender.MALE));
//        先过滤在统计
long count = customerList.stream().filter((customer) -> {
    return customer.getGender().equals(Gender.MALE);
}).count();
System.out.println(count);
7. collect 收集方法
  • toMap() 收集每个元素的长度(元素为 key,长度为 value)转换成一个 map
Map<String, Integer> map = Stream.of("C", "C++", "c#", "Java", "python", "Go", "php", "html", "visual basic", "visual basic", "visual basic", "basic", "basic", "B")
.distinct() //去重 因为这里不能做到覆盖操作 键重复会报错
.collect(Collectors.toMap((s) -> {
    return s;
}, (s) -> {
    return s.length();
}));
System.out.println(map);
  • mapping()映射方法

Stirng 类型的元素转换成 int 类型并且都乘以 100

List<Integer> integerList = Stream.of("10", "20", "60", "50", "70", "90")
.collect(Collectors.mapping((s) -> {
    return Integer.parseInt(s) * 100;
}, Collectors.toList()));
integerList.forEach(System.out::println);
  • groupingBy()分组操作,可按条件分为若干组
  1. 按照元素的长度分组
Stream.of("C", "C++", "c#", "Java", "python", "Go", "php", "html", "visual basic", "visual basic", "visual basic", "basic", "basic", "B")
.collect(Collectors.groupingBy((s) -> {
    return s.length();   // 按照元素的长度分组
}))
.forEach((k, v) -> {
    System.out.println(k + ":" + v);
});
  1. 按照元素的首字母分组
Stream.of("C", "C++", "c#", "Java", "python", "Go", "php", "html", "visual basic", "visual basic", "visual basic", "basic", "basic", "B")
.collect(Collectors.groupingBy((s) -> {
    return s.charAt(0);
}))
.forEach((k, v) -> {
    System.out.println(k + ":" + v);
});
  • partitioningBy()分区操作 将元素按条件分为两区,一区是符合条件的,一 区 是不符合条件的
Stream.of("C", "C++", "c#", "Java", "python", "Go", "php", "html", "visual basic", "visual basic", "visual basic", "basic", "basic", "B")
.collect(Collectors.partitioningBy((s) -> {
    return s.length() >= 3;
})).forEach((k, v) -> {
    System.out.println(k + ":" + v);
});
8. 统计操作

常见的有 mapToInt()mapToDouble()mapToLong()

这里使用的是mapToInt()

统计操作可以获得元素的最大值、最小值、平均值、累加值、以及元素个数

List<Integer> numList1 = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
//        stream ==> IntStream
IntStream intStream = numList1.stream().mapToInt((n) -> {
    return n;
});
//        获得统计结果
IntSummaryStatistics statistics = intStream.summaryStatistics();
System.out.println("最大值" + statistics.getMax());
System.out.println("最小值" + statistics.getMin());
System.out.println("平均值" + statistics.getAverage());
System.out.println("累加值" + statistics.getSum());
System.out.println("元素个数" + statistics.getCount());

标签:return,Stream,System,visual,basic,操作,out
From: https://blog.csdn.net/qq_64353233/article/details/142340930

相关文章

  • 26. 多进程理论、操作
    1.多进程相关理论1.1什么是进程进程是一个正在执行的任务或程序负责执行任务的是CPU(1)单任务单核CPU+多道技术实现多个进程的伪并发(2)多任务多个任务并发执行1.2 进程和程序的区别程序是代码的集合体进程是程序的执行过程1.3进程的调度算法(1)先来先服务算法 F......
  • [Java基础]集合的删除操作
    在Java中,直接在遍历集合时删除元素会引发ConcurrentModificationException,因为集合的结构在迭代过程中发生了变化。为了避免这种问题,可以使用Iterator或ListIterator来进行安全删除。下面介绍几种常见的方式。1.使用Iterator进行删除使用Iterator是在遍历集合时删除......
  • pve7.2虚拟机 lvm磁盘扩容,增加硬盘操作
    参考:https://blog.csdn.net/qq_32429805/article/details/132230402之前安装pve时候只有256的ssd,最近安装的虚拟机较多,给加块闲置硬盘,顺便学习一下,像pve这种虚拟机系统,硬盘应该可以像nas你这样随时增加,而不影响上层应用,我自己也是摸索着做。一、安装好硬盘后打开pve的管理页面,......
  • 2024-09-18:用go语言,给定一个从 0 开始的长度为 n 的正整数数组 nums 和一个二维操作数
    2024-09-18:用go语言,给定一个从0开始的长度为n的正整数数组nums和一个二维操作数组queries,每个操作由一个下标值indexi和一个数值ki组成。开始时,数组中的所有元素都是未标记的。依次执行m次操作,每次操作的过程如下:1.如果下标indexi对应的元素还未标记,则标记这个元素......
  • 制作U盘安装操作系统(启动盘、系统盘、Windows、Linux)
    第一种(Windows)官网windows制作启动盘1.打开Win11下载官网下载Windows11https://www.microsoft.com/zh-cn/software-download/windows112.下载制作操作系统工具这里不要下载错了3.启动工具选择U盘,选择你的U盘即可,一直下一步第二种(Windows、Linux)该方法使用Wind......
  • zblog教程:zblog程序升级如何操作?
    升级Z-Blog程序是一项重要的维护任务,确保你的博客系统保持最新并获得最新的功能和安全性改进。以下是详细的Z-Blog升级操作步骤,分为自动升级和手动升级两种方式。自动升级自动升级是一种较为简便的方式,适合大多数用户。以下是自动升级的具体步骤:备份当前版本在进行任何......
  • 菜鸟笔记之PWN入门(1.1.3)Linux基础操作和ELF文件保护
    这里不讨论Linux的历史及其与Windows的比较。直接介绍一些简单基础的操作。首先我们需要安装一个Linux操作系统(首先推荐Ubuntu),我们需要安装一个VM虚拟机,然后在里面搭建一个Ubuntu的虚拟机可以直接百度搜索,这里推荐一个文章安装虚拟机(VMware)保姆级教程(附安装包)_vmware虚拟机-......
  • milvus操作
    importjsonimportsysimporttimefrompymilvusimportconnections,Collection,FieldSchema,CollectionSchema,DataType,utility,Index#连接到Milvusdefconnect_milvus(host='xxxxxx',port='31800'):print("ConnectingtoMilvus...&qu......
  • Windows/Linux操作用户权限常用命令
    环境:centos7.5(主要),win7Linux/Centos(权限篇)一、概述Linux操作系统,设计用于支持多用户和处理多任务的服务器环境,实施了一套严密的权限控制系统。这一系统主要通过两个核心要素——用户身份和文件权限——来管理和限制对资源的访问。在Linux中,资源的访问权限是基于用户身份来控制......
  • Redis 字典的哈希函数和 rehash 操作详解
    Redis字典的哈希函数和rehash操作详解在Redis中,字典(HashTable)是一种重要的数据结构,用于存储键值对。下面解释Redis字典的哈希函数和rehash操作。一、哈希函数作用Redis的字典使用哈希函数将键转换为一个整数索引,这个索引用于确定键值对在哈希表中的存储位......