Stream流实战1_❀柒亗� 藍顏এ᭄的博客-程序员宝宝

技术标签: java基础  java  

Stream流中关于FlatMap、Reduce、查找和搜索

1.map & peek & flatmap

需求: 把集合中每个用户对象的敏感信息进行赋值null,在进行返回。为什么呢?

因为在开发,我大部分情况下都是使用orm框架:mybatis, hibernate,或者你写SQL写的 select * from 这个时候数据返回过程中可能就会从存在敏感信息,这个时候开发者一定有意识,就是脱敏。比如用户信息的密码因为要过滤才进行返回:

peek解决:

 List<User> userList = userList1.stream().peek(u -> u.setPassword("")).collect(Collectors.toList());
 userList.forEach(System.out::println);

map解决

List<User> userList2 = userList1.stream().map(u -> {
    
    u.setPassword("");
    return u;
}).collect(Collectors.toList());
userList2.forEach(System.out::println);

2.flatMap的认识

语法:

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
<R> Stream<R> map(Function<? super T, ? extends R> mapper);

使用:

List<Object> collect = userList1.stream().flatMap(user-> {
    
    user.setPassword("");
    return Stream.of(user);
}).collect(Collectors.toList());

collect.forEach(System.out::println);

3.flatmap的妙用

作用:合并、差集、交集、并集等操作非常的有用

public class StreamDemo02 {
    

    public static void main(String[] args) {
    

        // 1:创建一个集合
        List<User> userList1 = new ArrayList<>();
        userList1.add(new User(1, "小文", "123456", 16, 1, 20000d));
        userList1.add(new User(2, "老季", "123456", 22, 0, 100000d));
        userList1.add(new User(3, "怪咖", "123456", 13, 1, 89557d));
        userList1.add(new User(4, "小六", "123456", 26, 0, 78000d));
        userList1.add(new User(5, "小刘", "123456", 46, 1, 58000d));

        List<User> userList2 = new ArrayList<>();
        userList2.add(new User(6, "小文1", "123456", 16, 1, 20000d));
        userList2.add(new User(7, "老季2", "123456", 22, 0, 100000d));
        userList2.add(new User(8, "怪咖3", "123456", 13, 1, 89557d));
        userList2.add(new User(9, "小六4", "123456", 26, 0, 78000d));
        userList2.add(new User(10, "小刘5", "123456", 46, 1, 58000d));


        // 合并
        List<User> allUserList = Stream.of(userList1, userList2).flatMap(s -> s.stream()).collect(Collectors.toList());
        allUserList.forEach(System.out::println);

        // 2:合并flatmap + 在映射map
        List<String> allUserList2 = Stream.of(userList1, userList2).flatMap(s -> s.stream()) //Stream<User>
                .map(u -> {
    
                    return u.getUsername();
                }).collect(Collectors.toList());
        allUserList2.forEach(System.out::println);
    }
}


  • flatmap的场景一般来说多个集合操作的时候,它的价值就体现出来
  • 一般如果单集合操作flatmap其实意义不大。
    在这里插入图片描述

并集&交集&差集

public class StreamDemo02 {
    

    public static void main(String[] args) {
    

        // 1:创建一个集合
        List<User> userList1 = new ArrayList<>();
        userList1.add(new User(1, "小文", "123456", 16, 1, 20000d));
        userList1.add(new User(2, "老季", "123456", 22, 0, 100000d));
        userList1.add(new User(8, "怪咖3", "123456", 13, 1, 89557d));
        userList1.add(new User(3, "怪咖", "123456", 13, 1, 89557d));
        userList1.add(new User(4, "小六", "123456", 26, 0, 78000d));
        userList1.add(new User(5, "小刘", "123456", 46, 1, 58000d));

        List<User> userList2 = new ArrayList<>();
        userList2.add(new User(1, "小文", "123456", 16, 1, 20000d));
        userList2.add(new User(6, "小文1", "123456", 16, 1, 20000d));
        userList2.add(new User(7, "老季2", "123456", 22, 0, 100000d));
        userList2.add(new User(8, "怪咖3", "123456", 13, 1, 89557d));
        userList2.add(new User(9, "小六4", "123456", 26, 0, 78000d));
        userList2.add(new User(10, "小刘5", "123456", 46, 1, 58000d));

        // 合并 -- 并集
        //List<User> allUserList = Stream.of(userList1, userList2).flatMap(s -> s.stream()).collect(Collectors.toList());
        //allUserList.forEach(System.out::println);

        // 合并 -- 交集 -- 共同好友
        System.out.println("-=================================共同好友=====================");
        List<User> allUserList2 = userList1.stream().filter(new Predicate<User>() {
    
            @Override
            public boolean test(User user) {
    
                return userList2.contains(user);
            }
        }).collect(Collectors.toList());
        allUserList2.forEach(System.out::println);

        //List<User> allUserList2 = userList1.stream().filter(user -> userList2.contains(user) ).collect(Collectors.toList());
        //List<User> allUserList2 = userList1.stream().filter(userList2::contains).collect(Collectors.toList());
        //List<User> allUserList3 = userList1.stream().filter(StreamDemo02::contains).collect(Collectors.toList());

        System.out.println("-==================================差集=====================");
        // 合并 -- 差集
        List<User> allUserList3 = userList1.stream().filter(user -> !userList2.contains(user) ).collect(Collectors.toList());
        allUserList3.forEach(System.out::println);

        // 2:合并flatmap + 在映射map
//        List<String> allUserList2 = Stream.of(userList1, userList2).flatMap(s -> s.stream()) //Stream<User>
//                .map(u -> {
    
//                    return u.getUsername();
//                }).collect(Collectors.toList());
//        allUserList2.forEach(System.out::println);
    }


    public static boolean contains(Object o){
    
        return true;
    }

}


数字交集和差集和并集

public class StreamDemo03 {
    

    public static void main(String[] args) {
    


        List<Integer> list1 = new ArrayList<>();
        list1.add(1);
        list1.add(2);
        list1.add(3);
        list1.add(4);

        List<Integer> list2= new ArrayList<>();
        list2.add(4);
        list2.add(5);
        list2.add(6);
        list2.add(1);


        // 并集
        System.out.println("=============并集========================");
        List<Integer> collect = Stream.of(list1, list2).flatMap(s -> s.stream()).collect(Collectors.toList());
        collect.forEach(System.out::println);

        // 交集
        System.out.println("=============交集========================");
        List<Integer> collect2 =  list1.stream().filter(list2::contains).collect(Collectors.toList());
        collect2.forEach(System.out::println);


        // 差集
        System.out.println("=============差集========================");
        List<Integer> collect3 =  list1.stream().filter(u->!list2.contains(u)).collect(Collectors.toList());
        collect3.forEach(System.out::println);

        List<Integer> collect4 =  list2.stream().filter(u->!list1.contains(u)).collect(Collectors.toList());
        collect4.forEach(System.out::println);

    }


}


4.reduce(叠加,计算)

在并行处理情况下,传入给Reduce等方法的集合类,需要是线程安全的,否则执行结果会与预期结果不一样。

语法

  T reduce(T identity, BinaryOperator<T> accumulator);

案例

public class StreamDemo04 {
    

    public static void main(String[] args) {
    


        List<Integer> list1 = new ArrayList<>();
        list1.add(1);
        list1.add(2);
        list1.add(3);
        list1.add(4);
        //传一个参时
        int intValue = list1.stream().reduce((a, b) -> a + b).get();
        System.out.println(intValue);
		//传两个参时  要有初始值
        int intValue = list1.stream().reduce(1, (a, b) -> a + b).intValue();
        System.out.println(intValue);
        
        //传三个参时  要考虑并行   不做演示  
    }
}

5.其他的操作maptoInt、maptoDouble、maptoLong

可以用于聚合操作

public class StreamDemo05 {
    

    public static void main(String[] args) {
    

        List<ShopCart> shopCarts = new ArrayList<>();
        shopCarts.add(new ShopCart(1, "手机1", 1d, 1));//a
        shopCarts.add(new ShopCart(2, "手机2", 2d, 2));//b
        shopCarts.add(new ShopCart(3, "手机3", 3d, 3));

        double doubleValue1 = shopCarts.stream().map(shopcart -> shopcart.getPrice() * shopcart.getNum()).reduce(0d, (a, b) -> a + b).doubleValue();
        double doubleValue2 = shopCarts.stream().mapToDouble(shopcart -> shopcart.getPrice() * shopcart.getNum()).sum();
        double doubleValue3 = shopCarts.stream().mapToDouble(shopcart -> shopcart.getPrice()).average().getAsDouble();
        double doubleValue4 = shopCarts.stream().mapToDouble(shopcart -> shopcart.getPrice()).max().getAsDouble();
        double doubleValue5 = shopCarts.stream().mapToDouble(shopcart -> shopcart.getPrice()).min().getAsDouble();

        System.out.println(doubleValue1);
        System.out.println(doubleValue2);
        System.out.println(doubleValue3);
        System.out.println(doubleValue4);
        System.out.printn(doubleValue5);
    }
}


6.Stream流中查找和搜索

结束操作 anyMatch、noneMatch、allMatch

  • anyMatch - anything: 任何,任意 只要有一个为true,就是true,否则就是false
  • noneMatch: none :没有,无,没有一个满足条件就是true,否则就是false
  • allMatch: all:全部,所有。所有满足条件才是true,否则就是false
  • noneMatch 和 allMatch是相对立的
public class StreamDemo06 {
    

    public static void main(String[] args) {
    


        List<User> userList1 = new ArrayList<>();
        userList1.add(new User(1, "小文", "123456", 15, 1, 20000d));
        userList1.add(new User(2, "老季", "123456", 15, 0, 100000d));
        userList1.add(new User(8, "怪咖3", "123456", 15, 1, 89557d));
        userList1.add(new User(3, "怪咖", "123456", 15, 1, 89557d));
        userList1.add(new User(4, "小六", "123456", 15, 0, 78000d));
        userList1.add(new User(5, "小刘", "123456", 15, 1, 58000d));



//        User user = userList1.stream().findAny().get();
//        System.out.println(user);

//         anyMatch  只要集合中的某个元素满足条件就是true ,否则就是false
//        boolean anyMatch = userList1.stream().anyMatch(new Predicate<User>() {
    
//            @Override
//            public boolean test(User user) {
    
//                return user.getAge() > 16;
//            }
//        });

//      allMatch  和noneMatch是相对立的,必须条件全部满足才是true,否则false
//        boolean noneMatch = userList1.stream().allMatch(new Predicate<User>() {
    
//            @Override
//            public boolean test(User user) {
    
//                return user.getAge() > 16;
//            }
//        });
//        System.out.println(noneMatch);


        // noneMatch 相对于allMatch 必须条件全部不满足才是true,否则 false
        boolean noneMatch = userList1.stream().noneMatch(new Predicate<User>() {
    
            @Override
            public boolean test(User user) {
    
                return user.getAge() > 16;
            }
        });

        System.out.println(noneMatch);
    }



}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_54202286/article/details/121743608

智能推荐

【Oracle学习】之 手动开启服务_fanfan4569的博客-程序员宝宝_oracle 手动开启事务

前言:oracle服务太占内存。。。所以我就把设为手动开启的 一、启动Oracle 1.在使用Oracle时候,一般启动OracleServiceORCL和OracleOraDb11g_home1TNSListener这两个服务Oracle就能正常运行;管理者下运行cmdnet start oracleserviceXXXX//XXXX 通过服务查看。win10下查看服务打开管理打开服务

流传千年的三角形玩不?帕斯卡三角形,C语言经典算法之杨辉三角_莫影老师的博客-程序员宝宝

巴斯卡三角形行文不易,新手上路,多多关注,这真的对我很重要,私信更有惊喜巴斯卡三角形亦是杨辉三角,是 二项式系数 在三角形中的一种几何排列,在中国南宋数学家 杨辉 1261年所著的《 详解九章算法 》一书中出现。在欧洲, 帕斯卡 (1623----1662)在1654年发现这一 规律 ,所以这个表又叫做 帕斯卡三角形 。帕斯卡的发现比 杨辉 要迟393年,比 贾宪 迟600年。概述...

QVariant与自定义数据类型转换的方法_DerryZhang的博客-程序员宝宝

     在使用VC、Delphi编写用户界面程序的时候,经常会把对象与控件的data域进行绑定,便于程序运行中读写提高效率。然而在Qt编程中怎么实现这个功能呢?比如将一个用户自定义的结构体与QComboBox控件的data绑定?    Qt的联机帮助做的实在是差强人意,示例代码太少了。调试了半天,看到这篇文章给了我提示。主要步骤如下:    1、将自定义数据类型使用Q_DECLARE_M

Curl使用问题_gzshun的博客-程序员宝宝

在进行网页抓取和模拟登陆的开发,curl必须是首选的工具,由于它强大的功能,也提供了多个平台的支持。最近使用curl进行模拟登陆https网站,遇到了一些问题,问题的真相真是不好找,因为本身对网络方面的东西也不太熟悉,后来经过调试,还是找到原因了。curl下载:http://curl.haxx.se/download.html官网提供了多个平台的软件和动态库的下载,这里我使用Qt开

BZOJ-USACO被虐记_weixin_30314813的博客-程序员宝宝

bzoj上的usaco题目还是很好的(我被虐的很惨。有必要总结整理一下。1592: [Usaco2008 Feb]Making the Grade 路面修整一开始没有想到离散化。然后离散化之后就很好做了。F[I,j]表示第i个点,高度&gt;=j或&lt;=j,f[I,j]=min(f[i-1,j]+abs(b[j]-a[i]),f[I,j-1])1593: [Usaco2008 F...

NTLDR is missing_cudaon633797的博客-程序员宝宝

NTLDR is missing[@[email protected]]NTLDR is missing,进入BIOS,将SATA硬盘设置由AHCI模式设置为Compliance模式,保存设置,重启后,WindowsXP安装光盘就可识别SATA硬盘并进...

随便推点

SpringBoot多环境(dev、test、prod)配置_梦见南山的博客-程序员宝宝

项目开发中,我们往往需要根据不同环境修改配置文件,springboot提供了一套完美的解决方案我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml一般常见定义为:dev-开发环境 ,test-测试环境 ,prod-生产环境一、配置pom.xml &lt;profiles&gt; &lt;!-- 开...

Cat.1芯片模组产业解析_鲜枣课堂的博客-程序员宝宝

早在2015年,高通、Sequans、Altair等芯片厂商就已经推出了Cat.1芯片。当时中国4G刚开始建设,2G/3G共存,4G网络部署不成熟,而且,Cat.1的速率只有Cat.4的...

强推!Mac手势增强神器 BetterAndBetter 2.0.1中文版_qq_38482805的博客-程序员宝宝

Better And Better 2.0 将强大功能与优秀人机交互结合提升到一个崭新的高度。全面提升Mac触控板、鼠标、键盘使用,数百种动作手势、绘图手势与预设、脚本、快捷键完美协作,为你带来无与伦比的Mac操作体验。iCloud云同步,为你珍藏每一条规则。规则千万条,安全存储第一条。全新的Better And Better 2.0支持iCloud云同步,无论何时何地,你都可以完成规则设置的云端保存和下载。绘图手势,随便写写画画,惊喜即来。Better And...

python生成字典_haha13l4的博客-程序员宝宝

import itertools as itswords = input("请输入想要生成的数字、字母、特殊符号:").strip()word1 = input("请输入前面的固定字符,若没有直接enter:").strip()word2 = input("请输入后面的固定字符,若没有直接enter:").strip()len = int(input("请输入密码的长度,不包含前面和后面的...

记一次JavaScript API练习题_weixin_33754065的博客-程序员宝宝

之前,我在Codewars上看到一道名为Recover a secret string from random triplets的题,这道题使我沉思了很久,最终在朋友的帮助下我完成了这个题目。当我完成这个题目并且看到其他大神的答案时, 我就觉得我真的很有必要记录一下这道题,并且思考它在JavaScript中的实现。这道题目的大概意思是讲...

java内存泄漏--heap dump 文件分析_yee_20的博客-程序员宝宝_heapdump文件分析

一、phd格式分析工具--MAT1.MAT工具下载地址:https://www.eclipse.org/mat/downloads.phpps:mat不支持phd格式文件,需安装插件dtfj2.安装插件DTFJ全称(Diagnostic Tool Framework for Java)2.1下载地址http://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/runtimes/tools/dtfj/2.2 操作方.