【Java基础】集合处理 Stream的使用与正则表达式过滤

2023-05-16

在这里插入图片描述

目录

    • json编码与解析
    • 对对象流快速计数
    • List内部去重 / List转Set的方法
    • 两个List的元素去重后合并
    • 正则表达式软过滤字符
    • 参考

json编码与解析

依赖:


        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

实现:


    public static void fun18() {
        List<String> group1 = new ArrayList<>();
        group1.add("aaa");
        group1.add("bbb");
        group1.add("ccc");
        // json编码
        String s = JSON.toJSONString(group1);
        System.out.println(s);
		// json解码
        List<String> list = JSON.parseObject(s, new TypeReference<List<String>>(){});

        System.out.println(list);
        for (String s1 : list) {
            System.out.println(s1);
        }
    }
    
    public static void main(String[] args) {
        fun18();
    }

这里JSON.toJSONString()是将对象转为JSON字符串

JSON.parseObject(jsonString, new TypeReference<我是对象^_^>(){})是将 JSON字符串 jsonString 转为对象我是对象^_^

运行:

在这里插入图片描述

对对象流快速计数

对对象流快速计数

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class User {
        private String username;
        public String getUsername() {
            return username;
        }
    }

    public static void fun31() {
        List<User> users = Arrays.asList(
                new User("张三"),
                new User("李四"),
                new User("王五"),
                new User("赵六"),
                new User("田七")
        );

        Optional<Integer> count = users.stream()
                .map((e) -> 1)
                .reduce(Integer::sum); // 这是根据方法引用的第二种格式(即类::静态方法名)来书写成这样的
        System.out.println(count.get());
    }

运行:
在这里插入图片描述

List内部去重 / List转Set的方法

实现:


    public static void fun24() {
        List<String> group1 = new ArrayList<>();
        group1.add("aaa");
        group1.add("bbb");
        group1.add("ccc");
        group1.add("ccc");
        System.out.println(group1);

        Set<String> collect1 = group1.stream().collect(Collectors.toSet());
        System.out.println(collect1);

        List<String> collect2 = group1.stream().distinct().collect(Collectors.toList());
        System.out.println(collect2);
    }
    
    public static void main(String[] args) {
        fun24();
    }
    

group1.stream()以序列为基础转stream流

.distinct()每个元素只保留唯一一个,也就是去重。

group1.stream().collect(Collectors.toSet())将stream流重新转为set集合,利用集合的元素唯一性实现list内部去重。

运行:

在这里插入图片描述

两个List的元素去重后合并

实现


    public static void fun17() {
        List<String> group1 = new ArrayList<>();
        group1.add("aaa");
        group1.add("bbb");
        group1.add("ccc");
        List<String> group2 = new ArrayList<>();
        group2.add("ccc");
        group2.add("ddd");
        group2.add("eee");

        List<String> group = Stream.of(group1, group2).flatMap(Collection::stream).distinct().collect(Collectors.toList());
        System.out.println(group);
    }
    
    public static void main(String[] args) {
        fun17();
    }

这里Stream.of(group1, group2)是将两组List<?>合并为一组List<?>并以Stream类格式返回:Stream<List<?>>

.flatMap()则是将Stream中的每个元素通过.flatMap()中的映射函数处理。

Stream.of(group1, group2).flatMap(Collection::stream)则是对Stream<List<String>>做 Collection::stream 处理,得到:Stream<?>

.distinct()如其名所属,每个元素只保留唯一一个,也就是去重。

.collect(Collectors.toList())则是将Stream<?>重新转为List<?>格式

输出有:

在这里插入图片描述

正则表达式软过滤字符

软过滤这个说法是我自己瞎起的,我把错误输入直接抛出异常的情况叫硬过滤,把错误输入转为有效输入的情况叫软过滤

实现:


    public static void fun22() {
        String input = "爱莎萨*()!@#!%#^&*_=--~`@¥%%……(#DS116194亅7,;';;;'''^[\\u4E00-\\u9FA5]+";
        System.out.println(input);

        System.out.println();
        String s = charSoftFiltering(input);
        System.out.println(s);
    }

    public static String charSoftFiltering(String input) {
        // 正则表达式,只允许中文
        String pattern = "^[\\u4E00-\\u9FA5]+";

        // 匹配当前正则表达式
        Matcher matcher = Pattern.compile(pattern).matcher(input);
        // 定义输出
        String output = "";
        // 判断是否可以找到匹配正则表达式的字符
        if (matcher.find()) {
            // 将匹配当前正则表达式的字符串即文件名称进行赋值
            output = matcher.group();
        }
        return output;
    }

    
    public static void main(String[] args) {
        fun22();
    }

其中Pattern.compile(pattern)将给定的正则表达式编译为模式Pattern

这里.matcher(input)将给定的输入与模式相匹配。

matcher.find()查找与模式匹配的输入序列的下一个子序列,如果匹配成功,则可以通过开始start、结束end和分组group方法获得更多信息。

matcher.group()返回与上一个匹配项匹配的输入子序列,对于具有输入序列s的匹配器matcher,表达式matcher.group()s.substring(matcher.start(),matcher.end())等价。

运行:

在这里插入图片描述

可以看到成功提取了中文,但是过滤了各种乱码。

参考

https://blog.csdn.net/fzy629442466/article/details/84629422

https://blog.csdn.net/genggeonly/article/details/127767804?ops_request_misc=&request_id=&biz_id=102&utm_term

https://blog.csdn.net/mu_wind/article/details/109516995?ops_request_misc=

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

【Java基础】集合处理 Stream的使用与正则表达式过滤 的相关文章

  • 用于解析和构建逻辑表达式的 Java 库

    我正在寻找一个 Java 开源库来解析和构建类似 SQL 的表达式 例如评估表达式的有效性 例如 a x or y and b z 另外我想要一个用于构建或扩展表达式的 API 就像是 Expression exp new Expressi
  • 在 Java 中使用 Batik 检查和删除 SVG 中的属性

    这个问题基本上说明了一切 如何检查 SVG 是否具有 viewBox 属性 我正在使用蜡染库 我需要这个 因为我需要 至少 通知用户有一个 viewBox 属性 我可以删除它吗 使用 org w3c dom 类 您可以按照以下方式做一些事情
  • Java 卡布局。多张卡中的一个组件

    一个组件 例如JLabel 在多张卡中使用CardLayout 目前看来该组件仅出现在它添加到的最后一张卡上 如果有办法做到这一点 我应该吗 这是不好的做法吗 或者有其他选择吗 你是对的 它只出现在 添加到的最后一张卡 中 但这与CardL
  • 运行 java -jar 时出现 java.lang.ClassNotFoundException

    我正在使用 ant 来构建我的build xml文件 它编译正常 但随后得到运行时java lang NoClassDefFoundError通过 运行生成的 jar 时java jar my jar jar 似乎这个问题出现了很多 但没有
  • 记录共享和映射的诊断上下文

    据我所知 其他人做了什么来解决 Commons Logging 项目 针对 NET 和 Java 不支持映射或嵌套诊断上下文这一事实 执行摘要 我们选择直接使用实现者日志框架 在我们的例子中为 log4j 长答案 您是否需要一个抽象日志框架
  • 在java中将字符串日期转换为美国格式

    我有下面的代码 其中日期为字符串类型 我必须将其设置为美国格式 所以下面我已经展示了它 private static final SimpleDateFormat usOutputDate new SimpleDateFormat MM d
  • Struts 1 到 Spring 迁移 - 策略

    我有一个legacy银行应用程序编码为Struts 1 JSP现在的要求是迁移后端 目前为 MVC to Springboot MVC 后续UI JSP 将迁移到angular Caveats 1 后端不是无状态的 2 会话对象中存储了大量
  • 在带有 Protocol Buffers 的项目中使用 Proguard 有什么特点?

    我有一个使用 Google Protocol Buffers 的项目 一旦我尝试用 ProGuard 对其进行混淆 似乎 protobuf 会导致问题 我将所有自己的类打包成mybuildedclasses jar 谷歌代码被打包成prot
  • 在 Java 中创建 XML 文件的最佳方法是什么?

    我们目前使用 dom4j 来创建 XML 文件 不过 我猜现在有更好的东西了 如果我们使用的是 Java 1 6 或更高版本 那么在编写 XML 文件时最好使用什么类 运行速度最快 使用简单 我不需要构建一个 DOM 然后编写整个 DOM
  • 在 java 中运行外部应用程序但不要等待它完成

    我正在用java编写一个应用程序 允许我运行其他应用程序 为此 我使用了 Process 类对象 但当我这样做时 应用程序会等待进程结束 然后再退出 有没有办法在 Java 中运行外部应用程序 但不等待它完成 public static v
  • 如何在不反编译的情况下更改已编译的.class文件?

    我想更改 class 文件方法 我安装 JD Eclipse Decompiler 并打开 class 文件 我添加了一些代码并保存 class 文件 但是 class 文件没有改变 我不知道如何使用反编译器 如果可能的话 如何在不使用反编
  • 如何从intellij项目视图中隐藏不必要的文件?

    给定一个示例 gradle 项目 其项目结构如下所示 正如你所看到的 有很多东西你实际上不需要在想法中看到 但你需要它们存在 我知道下面被忽略的文件 文件夹类型Editor File Types但这些正在影响库和项目 idea 会在各处忽略
  • Java 中 JButton 的击键/热键

    最初我使用 JMenu 并建立热键以使用加速器工作 它运行得很好 现在我想在 JButton 中实现相同的行为 但我陷入困境 这是我编写的代码 请分享您的想法 以便我可以走上正确的道路 import javax swing import j
  • C 与 C++ 中的 JNI 调用不同?

    所以我有以下使用 Java 本机接口的 C 代码 但是我想将其转换为 C 但不知道如何转换 include
  • 使用单独的线程在java中读取和写入文件

    我创建了两个线程并修改了 run 函数 以便一个线程读取一行 另一个线程将同一行写入新文件 这种情况会发生直到整个文件被复制为止 我遇到的问题是 即使我使用变量来控制线程一一执行 但线程的执行仍然不均匀 即一个线程执行多次 然后控制权转移
  • BadPaddingException:无效的密文

    我需要一些帮助 因为这是我第一次编写加密代码 加密代码似乎工作正常 但解密会引发错误 我得到的错误是 de flexiprovider api exceptions BadPaddingException 无效的密文 in the 解密函数
  • 如何以编程方式创建 CardView

    我正在开发一个 Android 应用程序Java Android Studio 我想在活动中创建CardView以编程方式 我想将以下属性设置为CardView layout width wrap content layout row 0
  • 如何从 JavaFX 中的另一个控制器类访问 UI 元素?

    我有一个使用 NetBeans 8 编写的 JavaFX Java 8 应用程序 没有SceneBuilder 我的应用程序有一个主窗口 该窗口有自己的 FXML 文件 primary fxml 和自己的控制器类 FXMLPrimaryCo
  • Errors/BindingResult 参数应在模型属性、@RequestBody 或 @RequestPart 参数之后立即声明

    我通过剖析示例应用程序来自学 Spring 然后到处添加代码来测试我在剖析过程中开发的理论 在测试添加到 Spring 应用程序中的一些代码时 我收到以下错误消息 An Errors BindingResult argument is ex
  • 决策树和规则引擎 (Drools)

    In the application that I m working on right now I need to periodically check eligibility of tens of thousands of object

随机推荐