工作日常学习记录

使用情景

今天开发上遇到一个搜索的需求,要求可以多选,模糊查询。我首先和前端沟通,前端多选后使用逗号分隔,拼成字符串传输给我,我后端再进行具体的处理。

具体处理

初步构想

由于需要查询的字段也是一个长的字符串,那我就需要将参数逗号拆分后形成数组或者List,遍历进行查询,查询后再将结果组合起来,最后进行去重返回前端。

分析问题

如果使用这种暴力查询的话,一旦多选的子项多了,后端拆分后形成的数组或List也会相应变大,然后又进行遍历查询,导致效果会低下,响应时间过长,所以需要进行优化处理。

最终方案

在网上查阅一番后,发现Java8新特性Stream流中anyMatch,可以解决这个问题。

anyMatch简介

判断数据列表中是否存在任意一个元素符合设置的predicate条件,如果是就返回true,否则返回false。

  • 接口定义:
    • boolean anyMatch(Predicate<? super T> predicate);
  • 方法描述:
    • 在anyMatch 接口定义中是接收 Predicate 类型参数,在Lamdba表达式中 Predicate<T> 是接收一个T类型参数,然后经过逻辑验证返回布尔值结果。这里anyMatch表示,判断的条件里,任意一个元素符合条件,就返回true值。
示例代码
  @Test

    public void a17() {

        List<User> list = new ArrayList<>();

        list.add(new User("张三", 12, "南京"));

        list.add(new User("李四", 13, "北京"));

        list.add(new User("王五", 14, "苏州"));

        list.add(new User("王五", 17, "苏州"));

        List<User> userList = new ArrayList<>();

        userList.add(new User("李四", 13, "北京"));

        userList.add(new User("王五", 20, "广州"));

        // 获取两个集合中有相同名字或者年龄相同的,只要满足其中一个条件即可,只会返回list集合里面的元素,有先后顺序返回

        List<User> users1 = list.stream()

                .filter(a -> userList.stream().anyMatch(b -> a.getName().equals(b.getName()) || a.getAge() == b.getAge()))

                .collect(Collectors.toList());

        // 获取两个集合中相同名字并且年龄相同的,必须同时满足两个条件

        List<User> users2 = list.stream()

                .filter(a -> userList.stream().anyMatch(b -> a.getName().equals(b.getName()) && a.getAge() == b.getAge()))

                .collect(Collectors.toList());

        users1.forEach(item -> {

            System.out.println(item.getName() + item.getAge() + item.getEmailAddress());

        });

        /** 第一种结果展示:

         * 李四13北京

         * 王五14苏州

         * 王五17苏州

         */

        users2.forEach(item -> {

            System.out.println(item.getName() + item.getAge() + item.getEmailAddress());

        });

        /** 第二种结果展示:

         * 李四13北京

         */

    }

@Test

public void a15() {

        Stream<String> stream = Stream.of("ac", "bcddddd", "bd");

        // 判断stream中其中任何一个元素中只要有包含b字符串或者l字符串就返回true

        boolean isMatch = stream.anyMatch(str -> str.contains("b") || str.contains("l"));

        System.out.println(isMatch);  // true

}

最终实现核心代码

List<String> dss = Arrays.asList(diseaseSyndrome.split(","));
            list = list.stream().filter(e -> dss.stream().anyMatch(a->e.getDiseaseSyndrome().contains(a))).collect(Collectors.toList());

相关推荐

  1. 工作日常学习记录

    2024-07-09 22:44:06       30 阅读
  2. 工作学习记录

    2024-07-09 22:44:06       31 阅读
  3. 工作记录】AQS学习笔记

    2024-07-09 22:44:06       50 阅读
  4. Bonnie++ 工具学习记录

    2024-07-09 22:44:06       34 阅读
  5. StorCli工具学习记录

    2024-07-09 22:44:06       41 阅读
  6. 【机器学习】实验记录工具

    2024-07-09 22:44:06       64 阅读
  7. logging --- Python 的日志记录工具

    2024-07-09 22:44:06       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 22:44:06       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 22:44:06       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 22:44:06       90 阅读
  4. Python语言-面向对象

    2024-07-09 22:44:06       98 阅读

热门阅读

  1. ELK的储存、分析功能介绍!

    2024-07-09 22:44:06       27 阅读
  2. Linux实战记录

    2024-07-09 22:44:06       28 阅读
  3. 价值投资者什么时候卖出股票?

    2024-07-09 22:44:06       27 阅读
  4. 【大模型】小样本学习:解锁微调LLM的潜力

    2024-07-09 22:44:06       35 阅读
  5. 大数据处理系统架构特征

    2024-07-09 22:44:06       24 阅读
  6. 应用程序提权

    2024-07-09 22:44:06       28 阅读