百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Stream 流的使用技巧总结,这些你知道吗?

bigegpt 2024-08-09 11:14 2 浏览

1、简述

我们都知道Stream,是jdk8的一大新特性,极大地提高了道友们的开发效率(用过的道友都知道的),也使我们的代码看起来也更加地简洁,但Stream中除了Lambda表达式,另一块就是函数编程了,这块对于刚开始使用Stream的道友们来说,就得开始头疼抓狂了;别担心,下面我们就来总结一下常用技巧。

Stream有串行流stream与并行流parallelStream:

userList.stream()

userList.parallelStream()

一、基本类型集合

定义一个整型集合与字符串集合

List<Integer> integerList = new ArrayList<>();
        integerList.add(12);
        integerList.add(3);
        integerList.add(3);
        integerList.add(2);
List<String> stringList = new ArrayList<>();
        stringList.add("A");
        stringList.add("C");
        stringList.add("A");
        stringList.add("D");
        stringList.add("F");
        stringList.add("Q");

1、统计所有元素之和

int sum = integerList.stream().mapToInt(item -> item).sum();
//结果:20
//或者将结果直接转为long型
long sum = integerList.stream().mapToLong(item -> item).sum();
//20

2、剔除重复项后求和

int sum = integerList.stream().distinct().mapToInt(item -> item).sum(); 
//17

3、字符串去重

List<String> collect = stringList.stream().distinct().collect(Collectors.toList());

4、遍历每个元素

stringList.forEach(item-> {
    // todo your things,若调用的底层方法往上抛出了异常,这里需要手动try-catch
});

5、将元素拼成一个字符串

String collect = stringList.stream().distinct().collect(Collectors.joining());//ACADFQ
String collect = stringList.stream().distinct().collect(Collectors.joining(","));//A,C,A,D,F,Q
String collect = stringList.stream().distinct().collect(Collectors.joining(",", "(", ")"));//(A,C,A,D,F,Q)

6、分组后统计每组个数

Map<String, Long> collect = stringList.stream().collect(
             Collectors.groupingBy(item -> item, Collectors.counting()));
//{Q=1, A=2, C=1, D=1, F=1}

二 、对象集合

定义对象集合(有两个重复项)

[
    {
        "age": 10,
        "className": "计算机1",
        "sex": 0,
        "username": "nick10"
    },
    {
        "age": 10,
        "className": "计算机1",
        "sex": 0,
        "username": "nick10"
    },
    {
        "age": 12,
        "className": "计算机3",
        "sex": 0,
        "username": "nick12"
    },
    {
        "age": 13,
        "className": "计算机2",
        "sex": 1,
        "username": "nick13"
    },
    {
        "age": 14,
        "className": "计算机2",
        "sex": 0,
        "username": "nick14"
    },
    {
        "age": 15,
        "className": "计算机2",
        "sex": 1,
        "username": "nick15"
    },
    {
        "age": 16,
        "className": "计算机3",
        "sex": 0,
        "username": "nick16"
    },
    {
        "age": 17,
        "className": "计算机3",
        "sex": 1,
        "username": "nick17"
    },
    {
        "age": 19,
        "className": "计算机1",
        "sex": 1,
        "username": "nick19"
    },
    {
        "age": 19,
        "className": "计算机1",
        "sex": 1,
        "username": "nick19"
    }
]

List<User> userList = new ArrayList<>(); //省略add方法
//按班级分类收集
Map<String, List<User>> listMap = userList.stream().collect(
             Collectors.groupingBy(User::getClassName, Collectors.toList()));
//按班级分类收集(只保留一个元素)
//若你确定你的集合中需要作为key的元素不会出现重复,则可以用以下方式:
Map<String, User> userMap = userList.stream().collect(
            Collectors.toMap(User::getClassName, Function.identity()));
//若你不确定,你必须使用以下方式:
//后面使用value2表示保留最后一个,使用value1保留第一个
Map<String, User> userMap = userList.stream()
      .collect(Collectors.toMap(User::getClassName, Function.identity(), (value1, value2) -> value2));
//根据 username 剔除重复项
List<User> users = userList.stream()
                .collect(Collectors.collectingAndThen(Collectors.toCollection(() ->
                        new TreeSet<User>(Comparator.comparing(User::getUsername))), ArrayList::new));

## 三、特别注意点:

使用并行流parallelStream,千万不能使用toMap方法,toMap使用的是HashMap,

得用toConcurrentMap:

//错误示例
Map<String, User> userMap = userList.parallelStream()
        .collect(Collectors.toMap(User::getClassName, Function.identity()));
//正确示例
Map<String, User> userMap = userList.parallelStream()
       .collect(Collectors.toConcurrentMap(User::getClassName, Function.identity()));

也不能使用ArrayList,得用Vector:

List<String> usernames = new ArrayList<>();
//返回结果顺序不变
userList.forEach(user -> {
      usernames.add(user.getUsername());
});
//或者,返回结果顺序不变,虽然用的是并行流
List<String> collect1 = userList.parallelStream().map(User::getUsername)
           .collect(Collectors.toList());
//返回结果顺序改变
userList.parallelStream().forEach(user -> {
            usernames.add(user.getUsername());
  });

好了,今天就总结这么多,你学到了吗?

若是觉得文章还不错,记得点赞评论加转发哦!!!

相关推荐

10w qps缓存数据库——Redis(redis缓存调优)

一、Redis数据库介绍:Redis:非关系型缓存数据库nosql:非关系型数据库没有表,没有表与表之间的关系,更不存在外键存储数据的形式为key:values的形式c语言写的服务(监听端口),用来存...

Redis系列专题4--Redis配置参数详解

本文基于windowsX64,3.2.100版本讲解,不同版本默认配置参数不同在Redis中,Redis的根目录中有一个配置文件(redis.conf,windows下为redis.windows....

开源一夏 | 23 张图,4500 字从入门到精通解释 Redis

redis是目前出场率最高的NoSQL数据库,同时也是一个开源的数据结构存储系统,在缓存、数据库、消息处理等场景使用的非常多,本文瑞哥就带着大家用一篇文章入门这个强大的开源数据库——Redis。...

redis的简单与集群搭建(redis建立集群)

Redis是什么?是开源免费用c语言编写的单线程高性能的(key-value形式)内存数据库,基于内存运行并支持持久化的nosql数据库作用主要用来做缓存,单不仅仅是做缓存,比如:redis的计数器生...

推荐几个好用Redis图形化客户端工具

RedisPlushttps://gitee.com/MaxBill/RedisPlusRedisPlus是为Redis可视化管理开发的一款开源免费的桌面客户端软件,支持Windows、Linux...

关于Redis在windows上运行及fork函数问题

Redis在将数据库进行持久化操作时,需要fork一个进程,但是windows并不支持fork,导致在持久化操作期间,Redis必须阻塞所有的客户端直至持久化操作完成。微软的一些工程师花费时间在解决在...

你必须懂的Redis十大应用场景(redis常见应用场景)

Redis作为一款高性能的键值存储数据库,在互联网业务中有着广泛的应用。今天,我们就来详细盘点一下Redis的十大常用业务场景,并附上Golang的示例代码和简图,帮助大家更好地理解和应用Redis。...

极简Redis配置(redis的配置)

一、概述Redis的配置文件位于Redis安装目录下,文件名为redis.conf(Windows名为redis.windows.conf,linux下的是redis.conf)你可以通过C...

什么是redis,怎么启动及如何压测

从今天起咱们一起来学习一下关于“redis监控与调优”的内容。一、Redis介绍Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。...

一款全新Redis UI可视化管理工具,支持WebUI和桌面——P3X Redis UI

介绍P3XRedisUI这是一个非常实用的RedisGUI,提供响应式WebUI访问或作为桌面应用程序使用,桌面端是跨平台的,而且完美支持中文界面。Githubhttps://github....

windows系统的服务器快速部署java项目环境地址

1、mysql:https://dev.mysql.com/downloads/mysql/(msi安装包)2、redis:https://github.com/tporadowski/redis/r...

window11 下 redis 下载与安装(windows安装redis客户端)

#热爱编程是一种怎样的体验#window11下redis下载与安装1)各个版本redis下载(windows)https://github.com/MicrosoftArchive/r...

一款轻量级的Redis客户端工具,贼好用!

使用命令行来操作Redis是一件非常麻烦的事情,我们一般会选用客户端工具来操作Redis。今天给大家分享一款好用的Redis客户端工具TinyRDM,它的界面清新又优雅,希望对大家有所帮助!简介Ti...

一个.NET开发且功能强大的Windows远程控制系统

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!项目介绍SiMayRemoteMonitorOS是一个基于Windows的远程控制系统,完...

Redis客户端工具详解(4款主流工具)

大家好,我是mikechen。Redis是大型架构的基石,也是大厂最爱考察内容,今天就给大家重点详解4款Redis工具@mikechen本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集...