Java 8 Stream 流用法及语法

2023-10-26

Java 8 Stream 流用法

1.简介

Stream流 最全的用法
Stream 能用来干什么?用来处理集合,通过 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询,Stream API 提供了一种高效且易于使用的处理数据的方式

为什么用Java 8 Stream ?因为 操作简单
为什么操作简单?因为 Lambda 表达式,它极大的提高了编程效率和程序可读性
怎么操作流? 首先你的有个数据源(数组、集合),操作会产生新的流对象,原来的流对象不会改变
流用法有结束操作,这种代码不是你写了一个方法就执行一个方法,而是最后触发结束操作的时候才统一执行的,collect、foreach 方法就是一种结束方法,详情看代码及结果参考 2.映射map、flatMap用法 部分


2.具体用法
2.1 创建流
 // 集合创建流
        List<String> list = new ArrayList<>();
        // 获取一个顺序流
        Stream<String> listStream = list.stream();
        // 获取一个并行流
        Stream<String> parallelListStream = list.parallelStream();

        // 数组创建流
        Integer[] nums = new Integer[] { 1, 2, 3, 4, 5 };
        Stream<Integer> arrStream = Arrays.stream(nums);
        arrStream.forEach(System.out::println);// 1 2 3 4 5

        // 静态方法of创建流
        Stream<Integer> ofStream = Stream.of(1, 2, 3, 4, 5);
        ofStream.forEach(System.out::println);// 1 2 3 4 5

        // 静态方法iterate 创建流
        Stream<Integer> iterateStream = Stream.iterate(1, (x) -> x + 10).limit(4);
        iterateStream.forEach(System.out::println); // 1 11 21 31

        // 静态方法generate 创建流
        Stream<Double> generateStream = Stream.generate(Math::random).limit(2);
        generateStream.forEach(System.out::println);
2.2 操作流
1.过滤
  • filter:过滤流中的某些元素(可以做一些基本的判空、替换、判断逻辑操作)
  • limit(n):获取n个元素,结果获取几个元素
  • skip(n):跳过n元素,配合limit(n)可实现分页
  • distinct:通过流中元素的 hashCode() 和 equals() 去除重复元素
        //filter 判空
        Stream<Integer> notNullStreamObj = Stream.of(1, 2, null, 4, 5, 6, 7, null, 2);
        Stream<Integer> notNullStream = notNullStreamObj.filter(i -> (null != i));
        notNullStream.forEach(System.out::println);//1 2 4 5 6 7 2

        //filter 逻辑判断
        Stream<Integer> logicStreamObj = Stream.of(1, 2, null, 4, 5, 6, 7, null, 2);
        Stream<Integer> logicStream = logicStreamObj.filter(i -> (i != null && i > 5));
        logicStream.forEach(System.out::println); // 6 7

        //filter 替换
        Stream<String> strStreamObj = Stream.of("aa", "ab", null, "ac", "bd", "ee");
        Stream<String> strStream = strStreamObj.filter(str -> (null != str && str.contains("a")));
        strStream.forEach(System.out::println); // aa ab ac


        //skip 跳过
        Stream<String> skipStreamObj = Stream.of("aa", "ab", null, "ac", "bd", "ee");
        Stream<String> skipStream = skipStreamObj.skip(2);
        skipStream.forEach(System.out::println); // null ac bd ee

        //distinct 去重
        Stream<String> disStreamObj = Stream.of("aa", "ab", null, "ac", "aa", "ab", null, "ee");
        Stream<String> disStream = disStreamObj.distinct();
        disStream.forEach(System.out::println); // aa ab null ac ee
2.映射
  • map:接收一个函数作为参数,该函数会被应用到每个元素上,映射成一个新的元素。
  • flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。
  • peek:这个操作很骚,类似map只不过map 是Func函数,提供返回值,而peer是取出元素,Consumer表达式设值,我个人觉得没啥区别呢,官方文档提示:该方法主要用于调试,做一些消耗这个对象但不修改它的东西,没啥事不要用
很想问一下 这俩map、flatMap 区别 ,细品,你细品,你细细品

map是将每个元素 映射成一个新元素,除非你过滤了,否则不会改变元素个数
flatMap是将原流中的每个值都变成另一个流,然后把流合并串起来,必须有返回值,拼装成新的流

        //map 把包含a的元素,替换成| 注意,注意, 元素还是一个整体,对每个元素
        Stream<String> mapStreamObj = Stream.of("a,b,c", "a,e,f", "g,h,i");
        Stream<String> mapStream = mapStreamObj.map(str -> str.replaceAll(",", "|"));
        mapStream.forEach(System.out::println); // a|b|c a|e|f h|i|j

        //flatMap 可以把元素 切分后,再按照新元素组成新的字符串
        Stream<String> flatMapStreamObj = Stream.of("a,b,c", "a,e,f", "g,h,i");
        Stream<String> flatMapStream = flatMapStreamObj.flatMap(str -> {
            String[] arr = str.split(",");
            Stream<String> result = Arrays.stream(arr);
            return result;
        });
        flatMapStream.forEach(System.out::println); //a b c d e f g h i


        System.out.println("1===========");
        Stream<String> peekStreamObj = Stream.of("a,b,c", "a,e,f", "g,h,i");
        Stream<String> peekStream = peekStreamObj.peek(e -> System.out.println("Filtered value: " + e))
                .map(String::toUpperCase)
                .peek(e -> System.out.println("Mapped value: " + e));
        System.out.println("2=========== peek代码结束,但是日志没打印");
        Set<String> stringSet = peekStream.collect(Collectors.toSet());
        System.out.println("3=========== collect结束操作,代码日志打印");
        stringSet.forEach(System.out::println);

map执行结果

//看下执行结果,说明 collect才是结束操作,代码结束,但是并不是真正结束
1===========
2=========== peek代码结束,但是日志没打印
Filtered value: a,b,c
Mapped value: A,B,C
Filtered value: a,e,f
Mapped value: A,E,F
Filtered value: g,h,i
Mapped value: G,H,I
3=========== collect结束操作,代码日志打印
A,B,C
A,E,F
G,H,I
3.排序
  • sorted():自然排序,流中元素需实现Comparable接口
  • sorted(Comparator com):定制排序,自定义Comparator排序器

先构建一个User类

 public static class User {
       private String name;
       private Integer age;

       public User(String name, Integer age) {
           this.name = name;
           this.age = age;
       }

       public String getName() {
           return name;
       }

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

       public Integer getAge() {
           return age;
       }

       public void setAge(Integer age) {
           this.age = age;
       }

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

然后 看下sort用法

//按字母排序
       Stream<String> sortStreamObj = Stream.of("a,e,f", "a,d,c", "a,b,i");
       Stream<String> sortStream = sortStreamObj.sorted();
       sortStream.forEach(System.out::println); //abi adc aef


       User u1 = new User("bb", 1);
       User u2 = new User("aa", 2);
       User u3 = new User("cc", 3);
       User u4 = new User("aa", 4);

       Set<User> userSet = Sets.newHashSet(u1, u2, u3, u4);
       Stream<User> userStream = userSet.stream().sorted(
               (obj1, obj2) -> {
                   if (obj1.getName().equals(obj2.getName())) {
                       //name相等 按age
                       return obj1.getAge() - obj2.getAge();
                   }
                   return obj1.getName().compareTo(obj2.getName());
               }
       );

       userStream.forEach(System.out::println);// u2 u4 u1 u3

sort 执行结果

a,b,i
a,d,c
a,e,f
User{name='aa', age=2}
User{name='aa', age=4}
User{name='bb', age=1}
User{name='cc', age=3}
4.流匹配
  • allMatch:接收一个 Predicate 函数,当流中每个元素都符合该断言时才返回true,否则返回false
  • noneMatch:接收一个 Predicate 函数,当流中每个元素都不符合该断言时才返回true,否则返回false
  • anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足该断言则返回true,否则返回false
  • findFirst:返回流中第一个元素
  • findAny:返回流中的任意元素
  • count:返回流中元素的总个数
  • max:返回流中元素最大值
  • min:返回流中元素最小值
        List<Integer> numLists = Arrays.asList(3, 4, 5, 6, 10);
        // 全部匹配 - true
        boolean allMatch1 = numLists.stream().allMatch(e -> e > 2); //true
        System.out.println("allMatch1:" + allMatch1);

        // 全部匹配 - true
        boolean allMatch2 = numLists.stream().allMatch(e -> e > 5); //false
        System.out.println("allMatch2:" + allMatch2);

        // 全部都不符合 - true
        boolean noneMatch = numLists.stream().noneMatch(e -> e > 20); //true
        System.out.println("noneMatch:" + noneMatch);

        // 任一元素符合 - true
        boolean anyMatch = numLists.stream().anyMatch(e -> e > 4);  //true
        System.out.println("anyMatch:" + anyMatch);

        //返回第一个
        Integer findFirst = numLists.stream().findFirst().get(); //3
        System.out.println("findFirst:" + findFirst);

        //返回任一个
        Integer findAny = numLists.stream().findAny().get(); 
        System.out.println("findAny:" + findAny);

        //返回 count
        long count = numLists.stream().count(); //5
        System.out.println("count:" + count);

        //返回max
        Integer max = numLists.stream().max(Integer::compareTo).get(); //10
        System.out.println("max:" + max);

        //返回min
        Integer min = numLists.stream().min(Integer::compareTo).get();//3
        System.out.println("min:" + min);

匹配执行结果

allMatch1:true
allMatch2:false
noneMatch:true
anyMatch:true
findFirst:3
findAny:3
count:5
max:10
min:3
5.组合操作
  • Reduce 就是组合操作
  • Reduce(BinaryOperator accumulator) 没有起始值,按照运算规则进行运算操作
    解释:第一次执行时,accumulator函数的第一个参数为流中的第一个元素,第二个参数为流中元素的第二个元素,按照函数进行操作;
    第二次执行时,第一个参数为第一次函数执行操作的结果,第二个参数为流中的第三个元素;往下依次类推,返回Optinal 通过get()方法获取结果
  • Reduce(T identity, BinaryOperator accumulator)含有初始值,第二个是第一个的变形,跟第一个方法对比,不同的是此次这个会接受一个identity参数,用来指定Stream循环的初始值。如果Stream为空,就直接返回该值,特殊:该方法不会返回 Optional
Optional sumResult = Stream.of(1, 2, 3, 4)
                .reduce((sum, item) -> {
                    System.out.println("sum : " + sum);
                    sum += item;
                    System.out.println("item: " + item);
                    System.out.println("sum+ : " + sum);
                    System.out.println("-----——---");
                    return sum;
                });
        System.out.println("========sumResult: " + sumResult.get());


        Integer sumDefineResult = Stream.of(1, 2, 3, 4)
                .reduce(100, (sum, item) -> {
                    System.out.println("sum : " + sum);
                    sum += item;
                    System.out.println("item: " + item);
                    System.out.println("sum+ : " + sum);
                    System.out.println("---——-----");
                    return sum;
                });
        System.out.println("========sumDefineResult: " + sumDefineResult);

reduce 执行结果

//下面是执行结果
//查看执行结果
sum : 1
item: 2
sum+ : 3
-----——---
sum : 3
item: 3
sum+ : 6
-----——---
sum : 6
item: 4
sum+ : 10
-----——---
========sumResult: 10
sum : 100
item: 1
sum+ : 101
---——-----
sum : 101
item: 2
sum+ : 103
---——-----
sum : 103
item: 3
sum+ : 106
---——-----
sum : 106
item: 4
sum+ : 110
---——-----
========sumDefineResult: 110
6. 收集转换操作

这是个最最最最最基本的操作,10个流操作 9个都会使用到当前操作

  • collect(Collectors.toList()) 转换List
  • collect(Collectors.toSet()) 转换Set
  • Collectors.toMap(key, value) 转换Map ,如果key重复,!!!报错
  • Collectors.joining() join进行拼接
  • Collectors.groupingBy(key) 以Key为map的 key分组
  • Collectors.partitioningBy(规则) 以规则分区 比如 >5 ,map key为true,false
        User s1 = new User("aa", 1);
        User s2 = new User("bb", 2);
        User s3 = new User("cc", 3);
        User s4 = new User("dd", 2);
        List<User> list = Arrays.asList(s1, s2, s3, s4);

        //转换list
        List<Integer> ageList = list.stream().map(User::getAge).collect(Collectors.toList()); // [1, 2, 3]
        System.out.println(ageList.toString());

        //转成set
        Set<Integer> ageSet = list.stream().map(User::getAge).collect(Collectors.toSet()); // [1, 2, 3]
        System.out.println(ageSet);

        //转成map,注:key不能相同,否则报错
        Map<String, Integer> userMap = list.stream().collect(Collectors.toMap(User::getName, User::getAge)); // {cc=10, bb=20, aa=10}
        System.out.println(userMap);

        //字符串分隔符连接
        String joinName = list.stream().map(User::getName).collect(Collectors.joining(",", "(", ")")); // (aa,bb,cc)
        System.out.println(joinName);

        //分组
        Map<Integer, List<User>> ageMap = list.stream().collect(Collectors.groupingBy(User::getAge));
        System.out.println(ageMap);

        //多重分组,先根据类型分再根据年龄分
        Map<Integer, Map<Integer, List<User>>> typeAgeMap = list.stream().collect(Collectors.groupingBy(User::getAge, Collectors.groupingBy(User::getAge)));
        System.out.println(typeAgeMap);

        //分区
        //分成两部分,true 一部分age大于2岁, false 一部分age小于等于2岁
        Map<Boolean, List<User>> partMap = list.stream().collect(Collectors.partitioningBy(v -> v.getAge() > 2));
        System.out.println(partMap);

collect 执行结果

[1, 2, 3, 2]
[1, 2, 3]
{dd=2, cc=3, bb=2, aa=1}
(aa,bb,cc,dd)
{1=[User{name='aa', age=1}], 2=[User{name='bb', age=2}, User{name='dd', age=2}], 3=[User{name='cc', age=3}]}
{1={1=[User{name='aa', age=1}]}, 2={2=[User{name='bb', age=2}, User{name='dd', age=2}]}, 3={3=[User{name='cc', age=3}]}}
{false=[User{name='aa', age=1}, User{name='bb', age=2}, User{name='dd', age=2}], true=[User{name='cc', age=3}]}

我是 只知道瞎bb的小喵,欢迎拍砖!!!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 8 Stream 流用法及语法 的相关文章

  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • List和Map使用Stream流的例子:

    1 遍历List并输出 List list Arrays asList apple banana orange list stream forEach System out println 2 过滤List中的元素 List list Ar
  • pytorch自定义loss损失函数

    自定义loss的方法有很多 但是在博主查资料的时候发现有挺多写法会有问题 靠谱一点的方法是把loss作为一个pytorch的模块 比如 class CustomLoss nn Module 注意继承 nn Module def init s
  • selenium-java的使用教程

    selenium的使用教程 概述 selenium 是一个用于Web应用程序测试的工具 Selenium测试直接运行在浏览器中 就像真正的用户在操作一样 支持的浏览器包括IE 7 8 9 10 11 Mozilla Firefox Safa
  • IntelliJ IDEA扩展_解决运行Command line is too long

    老版本解决方法 在项目文件夹 idea workspace xml中找到
  • 关于Anaconda中Jyputer Notebook启动后不自动跳转网页Juypter问题的解决

    首先Juypter启动页面 我之前打开后不启动 就手动复制粘贴http 后面的网址在浏览器打开 每次这样很麻烦 上网查了下 有所感悟 灵感来自这个博主 http t csdn cn NMPQs 彻底解决该问题 1 win r 启动cmd 2
  • (二十三)用几何布朗运动模拟股价走势

    几何布朗运动的定义与表达式 用几何布朗运动模拟未来股价 下面我们以华泰证券 601688 股票为例 根据其2016年 2019年的日收盘价数据得到收益率和波动率 模拟未来三年 2020年 2022年 的价格走势 模拟路径为100条 S0设定
  • 集成电路(芯片 ic chip)详解

    集成电路 英文的全称是Integrated Circuit 中文简称为IC 集成电路 也有称为蕊片或chip的 集成电路 就是将晶体管 电阻 电容 二极管等电子组件整合装至一芯片 chip 上所构成的元件 现在的大规模 集成电路 可以集成几
  • 使用Java复制某一路径下的所有sql文件到另一目录下

    package com zyx test import java io File import java io FileInputStream import java io FileOutputStream import java io I
  • springboot下将项目打包部署 完整版 亲测

    我是将项目 打包成jar的 完整的springboot项目打包部署过程 1 设置我们的端口号 application properties中 server port 8080 2 配置我们的pom文件
  • 基于卷积的图像分类识别(一):AlexNet

    本专栏介绍基于深度学习进行图像识别的经典和前沿模型 将持续更新 包括不仅限于 AlexNet ZFNet VGG GoogLeNet ResNet DenseNet SENet MobileNet ShuffleNet Eifficient
  • 对一个多维数组随机添加高斯噪音

    这是对上一篇对一个数组随机赋零的提升版 mu 0 sigma 0 12 for i in range 17 有17列数据 a date iloc i i 1 取出某一列 a np array a index np arange len a
  • CUnit例子

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 关于CUnit的安装请自行百度 我的系统 fedora22 64bit 我的CUnit的头文件在 usr include CUnit 库文件在 usr lib64 文件 l
  • Scene窗口—Scene视图导航

    Scene 视图导航 Scene 视图具有一组可用于快速有效移动的导航控件 场景视图辅助图标 场景视图辅助图标 Scene Gizmo 位于 Scene 视图的右上角 此控件用于显示 Scene 视图摄像机的当前方向 并允许快速修改视角和投
  • 部署CNI网络插件 The connection to the server raw.githubusercontent.com was refused - did you specify the r

    访问不了 解决方案 1 找到域名对应的ip地址 域名ip查询链接链接 http ip tool chinaz com 2 etc hosts中添加主机ip映射信息 3 重新获取 kubectl apply f https raw githu
  • Android 13.0 Launcher3定制之双层改单层(去掉抽屉式三)

    1 概述 在13 0的系统产品开发中 对于在Launcher3中的抽屉模式中 系统默认的就是抽屉单层模式 但是在很多产品中需要默认为 单层模式 就是要求去掉双层抽屉模式 接下来看下如何继续实现去掉抽屉双层模式 来变成单层模式第三节 2 La
  • Centos彻底删除文件夹、文件命令

    centos彻底删除文件夹 文件命令 centos彻底删除文件夹 文件命令 centos 新建 删除 移动 复制等命令 1 新建文件夹 mkdir 文件名 新建一个名为test的文件夹在home下 view source1 mkdir ho
  • 谷歌身份验证器二维码

    otpauth totp ACCOUNT secret SECRET issuer NAME ACCOUNT账户名称 SECRET密钥 NAME发布者 公司 网站的名称 e g otpauth totp yimcarson secret V
  • 接口测试时遇到接口加密了该如何处理?

    对明文编码生成信息摘要 以防止被篡改 比如MD5使用的是Hash算法 无论多长的输入 MD5都会输出长度为128bits的一个串 摘要算法不要秘钥 客户端和服务端采用相同的摘要算法即可针对同一段明文获取一致的密文 对称加密 对称加密算法是共
  • 冒泡排序算法的Java实现及优化

    冒泡排序是一种简单但效率较低的排序算法 它通过多次交换相邻元素的位置来实现排序 本篇博客将介绍如何使用Java编程语言实现冒泡排序算法 并对其进行优化 首先 让我们来了解一下冒泡排序的基本原理 冒泡排序的思想是从数组的起始位置开始 比较相邻
  • Java 8 Stream 流用法及语法

    Java 8 Stream 流用法 1 简介 Stream流 最全的用法 Stream 能用来干什么 用来处理集合 通过 使用Stream API 对集合数据进行操作 就类似于使用 SQL 执行的数据库查询 Stream API 提供了一种