Java8使用Stream流实现List列表查询、统计、排序、分组、合并

Java8使用Stream流实现List列表查询、统计、排序以及分组

目录

  • 一、查询方法
    • 1.1 forEach
    • 1.2 filter(T -> boolean)
    • 1.3 filterAny() 和 filterFirst()
    • 1.4 map(T -> R) 和 flatMap(T -> Stream)
    • 1.5 distinct()
    • 1.6 limit(long n) 和 skip(long n)
  • 二、判断方法
    • 2.1 anyMatch(T -> boolean)
    • 2.2 allMatch(T -> boolean)
    • 2.3 noneMatch(T -> boolean)
  • 三、统计方法
    • 3.1 reduce((T, T) -> T) 和 reduce(T, (T, T) -> T)
    • 3.2 mapToInt(T -> int) 、mapToDouble(T -> double) 、mapToLong(T -> long)
    • 3.3 使用 counting() 或 count()
    • 3.4 summingInt() 、summingLong()、summingDouble()
    • 3.5 averagingInt() 、averagingLong()、averagingDouble()
    • 3.6 summarizingInt()、summarizingLong()、summarizingDouble()
    • 3.7 BigDecimal类型的统计
  • 四、排序方法
    • 4.1 sorted() / sorted((T,T) -> int)
  • 五、分组方法
    • 5.1 groupingBy
    • 5.2 多级分组
    • 5.3 分组汇总
  • 六、List的合并
    • 6.1 并集
    • 6.2 交集

List的 Stream流操作可以简化我们的代码,减少程序运行的压力,应对上面的问题,下面这篇文章主要给大家介绍了关于 Java8使用Stream流实现List列表查询、统计、排序以及分组的相关资料,需要的朋友可以参考下

Java8提供了Stream(流)处理集合的关键抽象概念,它可以对集合进行操作,可以执行非常复杂的查找、过滤和映射数据等操作。

Stream API 借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性。

下面是使用Stream的常用方法的综合实例。

创建User类作为持久层

package com.example.demo.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import java.math.BigDecimal;/*** @author qzz* @date 2023/3/21*/
@Data
@AllArgsConstructor
public class User {/*** 用户id*/private Integer id;/*** 名称*/private String name;/*** sex*/private String sex;/*** 年龄*/private Integer age;/*** 部门*/private String department;/*** 薪资*/private BigDecimal salary;
}

创建UserService.class 用户信息业务逻辑类

package com.example.demo.service;import com.example.demo.entity.User;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;/*** 用户信息业务逻辑类* @author qzz* @date 2024/6/21*/
@Service
public class UserService {/*** 获取用户列表* @return*/public List<User> getUserList(){List<User> userList = new ArrayList<>();userList.add(new User(1,"张三","男",26, "研发部", BigDecimal.valueOf(3000)));userList.add(new User(2,"李斯","男",30, "财务部", BigDecimal.valueOf(2000)));userList.add(new User(3,"张倩","女",26, "人事部", BigDecimal.valueOf(1600)));userList.add(new User(4,"吴昕","女",30, "研发部", BigDecimal.valueOf(2000)));userList.add(new User(5,"刘希","女",26, "财务部", BigDecimal.valueOf(1300)));return userList;}
}

一、查询方法

1.1 forEach

使用forEach()遍历列表信息。

    /*** 1.使用forEach()遍历列表信息*/@Testpublic void forEachTest(){//获取用户列表List<User> userList = userService.getUserList();//遍历用户列表 方法一:userList.forEach(user -> {System.out.println(user);});System.out.println();//遍历用户列表 方法二:     函数式接口 变量名 = 类实例::方法名userList.forEach(System.out::println);}

控制台输出:
在这里插入图片描述

1.2 filter(T -> boolean)

使用filter()过滤列表数据。

【示例】获取部门为’研发部’的用户列表

    /*** 2.使用filter()过滤列表数据*/@Testpublic void filterTest(){//获取用户列表List<User> userList = userService.getUserList();//获取部门为'研发部'的用户列表userList = userList.stream().filter(user -> user.getDepartment().equals("研发部")).collect(Collectors.toList());//遍历用户列表userList.forEach(System.out::println);}

控制台输出:
在这里插入图片描述

1.3 filterAny() 和 filterFirst()

使用 filterAny() 和 filterFirst() 获取第一条数据。

    /*** 3.filterAny()和filterFirst() :获取第一条数据*/@Testpublic void filterAnyTest(){//获取用户列表List<User> userList = userService.getUserList();//获取用户名称为'张三'的用户信息,如果没有找到则返回nullUser user = userList.stream().filter(u -> u.getName().equals("张三")).findAny().orElse(null);//输出用户信息System.out.println(user);}

控制台输出:
在这里插入图片描述
注意:findFirst() 和 findAny() 都是获取列表中的第一条数据,但是findAny()操作,返回的元素是不确定的,对于同一个列表多次调用findAny()有可能会返回不同的值。使用findAny()是为了更高效的性能。

如果是数据较少,串行地情况下,一般会返回第一个结果,如果是并行(parallelStream并行流)的情况,那就不能确保是第一个。

例如:使用parallelStream并行流,findAny() 返回的就不一定是第一条数据

//parallelStream方法能生成并行流,使用filterAny返回的 不一定是第一条数据
User user = userList.parallelStream().filter(u -> u.getName().startsWith("wsq")).findAny().orElse(null);

1.4 map(T -> R) 和 flatMap(T -> Stream)

使用map()将流中的每一个元素 T 映射为 R(类似类型转换)
使用flatmap()将流中的每一个元素 T 映射为 一个流,再把每一个流连接成为一个流。

【示例】使用map()方法获取用户列表中的名称列。

    /*** 4.1使用map()获取列元素*/@Testpublic void mapTest(){//获取用户列表List<User> userList = userService.getUserList();//获取用户名称列表List<String> nameList = userList.stream().map(User::getName).collect(Collectors.toList());
//        或者:List<String> nameList = userList.stream().map(user -> user.getName()).collect(Collectors.toList());//输出用户名称信息nameList.forEach(System.out::println);}

控制台输出:
在这里插入图片描述
【示例】使用flatmap()方法将流中的每一个元素连接成为一个流。

    /*** 4.2使用flatMap()将流中的每一个元素连接成为一个流*/@Testpublic void flatMapTest(){//创建城市List<String> cityList = new ArrayList<>();cityList.add("北京;上海;深圳;");cityList.add("广州;武汉;杭州;");//分隔城市列表,使用 flatMap()将流中的每一个元素连接成为一个流cityList = cityList.stream().map(city -> city.split(";")).flatMap(Arrays::stream).collect(Collectors.toList());//输出城市列表cityList.forEach(System.out::println);}

控制台输出:
在这里插入图片描述

1.5 distinct()

使用 distinct()方法可以去除重复的数据。

【示例】获取部门列表,并去除重复数据

    /*** 5.distinct()去除重复的数据*/@Testpublic void distinct(){//获取用户列表List<User> userList = userService.getUserList();//获取部门列表,并去除重复数据List<String> departmentList = userList.stream().map(User::getDepartment).distinct().collect(Collectors.toList());//输出部门列表departmentList.forEach(System.out::println);}

控制台输出:
在这里插入图片描述

1.6 limit(long n) 和 skip(long n)

limit(long n) 方法用于返回前n条数据,skip(long n)方法用于跳过前n条数据。

【示例】获取用户列表,要求跳过第1条数据后的前3条数据

/*** 6.limit(long n) 和 skip(long n)*/@Testpublic void limitAndSkipTest(){//获取用户列表List<User> userList = userService.getUserList();//获取用户列表,要求 跳过第一条数据后的前3条数数据userList = userList.stream().skip(1).limit(3).collect(Collectors.toList());//输出用户列表userList.forEach(System.out::println);}

控制台输出:
在这里插入图片描述

二、判断方法

2.1 anyMatch(T -> boolean)

使用 anyMatch(T -> boolean) 判断流中是否 有一个元素 匹配给定的 T -> boolean 条件

2.2 allMatch(T -> boolean)

使用 allMatch(T -> boolean) 判断流中是否 所有元素 都匹配给定的 T -> boolean 条件。

2.3 noneMatch(T -> boolean)

使用 noneMatch(T -> boolean) 流中是否 没有元素 匹配给定的 T -> boolean 条件。

【示例】使用 anyMatch()、allMatch()、noneMatch() 进行判断。

    /*** 使用 anyMatch()、allMatch()、noneMatch() 进行判断*/@Testpublic void matchTest(){//获取用户列表List<User> userList = userService.getUserList();//判断用户列表中 是否存在 名称为”张三“ 的 数据boolean result1 = userList.stream().anyMatch(user -> user.getName().equals("张三"));//判断用户名称   是否都包含”张三“ 的 数据boolean result2 = userList.stream().allMatch(user -> user.getName().contains("张三"));//判断用户名称   是否存在都不包含”张三“ 的 数据boolean result3 = userList.stream().noneMatch(user -> user.getName().contains("张三"));//输出用户列表System.out.println(result1);System.out.println(result2);System.out.println(result3);}

控制台输出:
在这里插入图片描述

三、统计方法

3.1 reduce((T, T) -> T) 和 reduce(T, (T, T) -> T)

使用 reduce((T, T) -> T) 和 reduce(T, (T, T) -> T) 用于组合流中的元素,如求和,求积,求最大值等。

【示例】使用 reduce() 求用户列表中年龄的最大值、最小值、总和

    /*** 使用 reduce() 求用户列表中年龄的最大值、最小值、总和*/@Testpublic void reduceTest(){//获取用户列表List<User> userList = userService.getUserList();//用户列表中年龄的 最大值、最小值、总和int maxVal = userList.stream().map(User::getAge).reduce(Integer::max).get();int minVal = userList.stream().map(User::getAge).reduce(Integer::min).get();int sumVal = userList.stream().map(User::getAge).reduce(0,Integer::sum);//打印结果System.out.println("最大年龄:" + maxVal);System.out.println("最小年龄:" + minVal);System.out.println("年龄总和:" + sumVal);}

控制台输出:
在这里插入图片描述

3.2 mapToInt(T -> int) 、mapToDouble(T -> double) 、mapToLong(T -> long)

int sumVal = userList.stream().map(User::getAge).reduce(0,Integer::sum);计算元素总和的方法其中暗含了装箱成本,map(User::getAge) 方法过后流变成了 Stream 类型,而每个 Integer 都要拆箱成一个原始类型再进行 sum 方法求和,这样大大影响了效率。

针对这个问题 Java 8 有良心地引入了数值流 IntStream, DoubleStream, LongStream,这种流中的元素都是原始数据类型,分别是 int,double,long

流转换为数值流

  • mapToInt(T -> int) : return IntStream
  • mapToDouble(T -> double) : return DoubleStream
  • mapToLong(T -> long) : return LongStream

【示例】使用 mapToInt() 求用户列表中年龄的最大值、最小值、总和、平均值

/*** 使用 mapToInt() 求用户列表中年龄的最大值、最小值、总和、平均值*/@Testpublic void mapToIntTest(){//获取用户列表List<User> userList = userService.getUserList();//用户列表中年龄的 最大值、最小值、总和、平均值int maxVal = userList.stream().mapToInt(User::getAge).max().getAsInt();int minVal = userList.stream().mapToInt(User::getAge).min().getAsInt();int sumVal = userList.stream().mapToInt(User::getAge).sum();double aveVal = userList.stream().mapToInt(User::getAge).average().getAsDouble();//打印结果System.out.println("最大年龄:" + maxVal);System.out.println("最小年龄:" + minVal);System.out.println("年龄总和:" + sumVal);System.out.println("平均年龄:" + aveVal);}

控制台输出:
在这里插入图片描述

3.3 使用 counting() 或 count()

使用 counting() 或 count() 可以对列表数据进行统计。

【示例】使用 count() 统计用户列表信息。

    /*** 使用 counting() 或 count() 统计*/@Testpublic void countTest(){//获取用户列表List<User> userList = userService.getUserList();//统计研发部的人数,使用counting()方法进行统计Long departCount = userList.stream().filter(user -> user.getDepartment().equals("研发部")).collect(Collectors.counting());//统计30岁以上的人数,使用count()方法进行统计(推荐)Long ageCount = userList.stream().filter(user -> user.getAge() >= 30).count();//统计薪资大于1500元以上的人数Long salaryCount = userList.stream().filter(user -> user.getSalary().compareTo(BigDecimal.valueOf(1500)) == 1).count();//打印结果System.out.println("研发部的人数:" + departCount + "人");System.out.println("30岁以上的人数:" + ageCount + "人");System.out.println("薪资大于1500元以上的人数:" + salaryCount + "人");}

控制台输出:
在这里插入图片描述

3.4 summingInt() 、summingLong()、summingDouble()

用于计算总和,需要一个函数参数

    /*** 使用 summingInt() 、summingLong()、summingDouble() 计算总和*/@Testpublic void sumTest(){//获取用户列表List<User> userList = userService.getUserList();//计算年龄总和int sunAge = userList.stream().collect(Collectors.summingInt(User::getAge));//打印结果System.out.println("年龄总和:" + sunAge);}

控制台输出:
在这里插入图片描述

3.5 averagingInt() 、averagingLong()、averagingDouble()

用于计算平均值

/*** 使用 averagingInt() 、averagingLong()、averagingDouble() 计算平均值*/@Testpublic void averagingTest(){//获取用户列表List<User> userList = userService.getUserList();//计算平均年龄Double aveAge = userList.stream().collect(Collectors.averagingInt(User::getAge));//打印结果System.out.println("平均年龄:" + aveAge);}

控制台输出:
在这里插入图片描述

3.6 summarizingInt()、summarizingLong()、summarizingDouble()

这三个方法比较特殊,比如 summarizingInt 会返回 IntSummaryStatistics 类型

IntSummaryStatistics类提供了用于计算的平均值、总数、最大值、最小值、总和等方法
方法如下图:

    /*** 使用 IntSummaryStatistics 统计:最大值、最小值、总和、平均值、总数*/@Testpublic void summarizingIntTest(){//获取用户列表List<User> userList = userService.getUserList();//获取IntSummaryStatistics对象IntSummaryStatistics ageStatistics = userList.stream().collect(Collectors.summarizingInt(User::getAge));//统计:最大值、最小值、总和、平均值、总数System.out.println("最大年龄:" + ageStatistics.getMax());System.out.println("最小年龄:" + ageStatistics.getMin());System.out.println("年龄总和:" + ageStatistics.getSum());System.out.println("平均年龄:" + ageStatistics.getAverage());System.out.println("员工总数:" + ageStatistics.getCount());}

控制台输出:
在这里插入图片描述

3.7 BigDecimal类型的统计

对于资金相关的字段,通常会使用BigDecimal数据类型

【示例】统计用户薪资信息

    /*** BigDecimal类型的统计*/@Testpublic void bigDecimalTest(){//获取用户列表List<User> userList = userService.getUserList();//最高薪资BigDecimal maxSalary = userList.stream().map(User::getSalary).max((x1,x2) -> x1.compareTo(x2)).get();//最低薪资BigDecimal minSalary = userList.stream().map(User::getSalary).min((x1,x2) -> x1.compareTo(x2)).get();//薪资总和BigDecimal sumSalary = userList.stream().map(User::getSalary).reduce(BigDecimal.ZERO, BigDecimal::add);//平均薪资BigDecimal aveSalary = userList.stream().map(User::getSalary).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(userList.size()), 2, BigDecimal.ROUND_HALF_UP);//打印统计结果System.out.println("最高薪资: " + maxSalary + "元");System.out.println("最低薪资: " + minSalary + "元");System.out.println("薪资总和: " + sumSalary + "元");System.out.println("平均薪资: " + aveSalary + "元");}

控制台输出:
在这里插入图片描述

四、排序方法

4.1 sorted() / sorted((T,T) -> int)

如果流中的元素的类实现了 Comparable 接口,即有自己的排序规则,那么可以直接调用 sorted() 方法对元素进行排序,如 Stream。反之, 需要调用 sorted((T, T) -> int) 实现 Comparator 接口

【示例】根据用户年龄进行排序。

/*** 使用 sorted() 排序*/
@Test
public void sortedTest(){//获取用户列表List<User> userList = userService.getUserList();//根据年龄排序(升序)userList = userList.stream().sorted((u1,u2) -> u1.getAge() - u2.getAge()).collect(Collectors.toList());//推荐(升序):userList = userList.stream().sorted(Comparator.comparingInt(User::getAge)).collect(Collectors.toList());//降序:userList = userList.stream().sorted(Comparator.comparingInt(User::getAge).reversed()).collect(Collectors.toList());//遍历用户列表userList.forEach(System.out::println);
}

控制台输出:
在这里插入图片描述

五、分组方法

5.1 groupingBy

使用 groupingBy() 将数据进行分组,最终返回一个 Map 类型。

【示例】根据部门对用户列表进行分组

/*** 使用 groupingBy() 分组*/@Testpublic void groupingByTest(){//获取用户列表List<User> userList = userService.getUserList();//根据部门对用户列表进行分组Map<String, List<User>> userMap = userList.stream().collect(Collectors.groupingBy(User::getDepartment));//遍历分组后的结果userMap.forEach((key,value) -> {System.out.println(key + ": ");value.forEach(System.out::println);System.out.println("-----------------------------------------------------");});}

控制台输出:
在这里插入图片描述

5.2 多级分组

groupingBy 可以接受一个第二参数实现多级分组。

【示例】根据部门和性别对用户列表进行分组。

    /*** 使用 groupingBy() 多级分组*/@Testpublic void multGroupingByTest(){//获取用户列表List<User> userList = userService.getUserList();//根据部门和性别对用户列表进行分组Map<String, Map<String,List<User>>> userMap = userList.stream().collect(Collectors.groupingBy(User::getDepartment,Collectors.groupingBy(User::getSex)));//遍历分组后的结果userMap.forEach((key1,map) -> {System.out.println(key1 + ": ");map.forEach((key2,user)->{System.out.println(key2 + ": ");user.forEach(System.out::println);});System.out.println("-----------------------------------------------------");});}

控制台输出:
在这里插入图片描述

5.3 分组汇总

【示例】根据部门进行分组,汇总各个部门用户的平均年龄。

    /*** 使用 groupingBy() 分组汇总*/@Testpublic void groupingByCollectTest(){//获取用户列表List<User> userList = userService.getUserList();//根据部门进行分组,汇总各个部门用户的平均年龄Map<String, Double> userMap = userList.stream().collect(Collectors.groupingBy(User::getDepartment, Collectors.averagingInt(User::getAge)));//遍历分组后的结果userMap.forEach((key,value) -> {System.out.println(key + "的平均年龄: " + value);});}

控制台输出:
在这里插入图片描述

六、List的合并

6.1 并集

    /*** 得到两个集合的并集*/@Testpublic void unionTest(){List<String> list1 = new ArrayList<>();list1.add("aaa");list1.add("bbb");list1.add("ccc");list1.add("ddd");List<String> list2 = new ArrayList<>();list2.add("aaa");list2.add("ccc");list2.add("ddd");list2.add("eee");list2.add("fff");list2.add("aaa1");list2.add("aaa2");//根据整个对象是否一致来去重合并得到集合System.out.println("并集写法 [去重]");List<String> collect = Stream.of(list1, list2).flatMap(Collection::stream).distinct().collect(Collectors.toList());System.out.println(collect.toString());}

6.2 交集

    /*** 得到两个集合的交集*/@Testpublic void unionTest(){List<String> list1 = new ArrayList<>();list1.add("aaa");list1.add("bbb");list1.add("ccc");list1.add("ddd");List<String> list2 = new ArrayList<>();list2.add("aaa");list2.add("ccc");list2.add("ddd");list2.add("eee");list2.add("fff");list2.add("aaa1");list2.add("aaa2");System.out.println("交集写法 [去重]");List<String> collect1 = list1.stream().filter(s-> list2.contains(s)).distinct().collect(Collectors.toList());System.out.println(collect1.toString());}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

threejs-- add()和attach()的区别(不受父对象影响)

add和attach的区别 add()方法:attach()方法:总结区别: 在Three.js中&#xff0c;add()和attach()方法都涉及将一个物体&#xff08;object&#xff09;添加到另一个物体&#xff08;Object3D&#xff09;上&#xff0c;但它们有不同的作用和用法&#xff1a; add()方法: add(…

容器之按钮盒构件演示

代码; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);GtkWidget *window;window gtk_window_new(GTK_WINDO…

Eclipse使用SpringXml to Java没有反应或者报错

Eclipse使用SpringXml to Java没有反应或者报错 定位错误方法&#xff1a; 通过Window -> Show View -> Error Log打开错误日志视图。 错误日志会记录Eclipse运行时发生的各种错误和警告&#xff0c;包括插件和工具的问题。 在错误日志中查找与你执行的Spring XML to J…

Python学习系列之三目运算

Python学习系列之三目运算 前言C#的三目运算Python的三目运算总结 前言 在项目常有一些运算比较&#xff0c;之前使用的C#常用三目运算&#xff0c;减少使用switch或者if else来减少语句。 当C#转化为python时&#xff0c;三目运算使用不同了。 C#的三目运算 这里举个例子&am…

xargs 传参

xargs的默认命令是 echo&#xff0c;空格是默认定界符。这意味着通过管道传递给 xargs的输入将会包含换行和空白&#xff0c;不过通过 xargs 的处理&#xff0c;换行和空白将被空格取代。xargs是构建单行命令的重要组件之一。 xargs -n1 // 一次输出一个参数到一行&#xf…

使用NestJS构建安全密码重置功能的完整指南:实现短信链接跳转验证功能

引言 实现忘记密码的短信链接验证功能&#xff0c;可以按照以下步骤进行&#xff1a; 用户请求重置密码&#xff1a;用户提供注册手机号码&#xff0c;系统生成一个唯一的重置令牌&#xff08;token&#xff09;&#xff0c;将令牌和用户信息存储在数据库中&#xff0c;并将包…

Linux系统异常进程管理

Linux系统异常进程管理 1、异常关闭服务和进程 1&#xff09;【杀】进程 kill 进程【号】 ##温和、优雅 pkill 进程【名】 ##一下爆头 killall 进程【名】 ##优雅&#xff0c;可能需要多次反复 2&#xff09;杀不掉处理&#xff08;慎用&#xff09; 强制&#xff0c;一…

Python学习笔记16:进阶篇(五)异常处理

异常 在编程中&#xff0c;异常是指程序运行过程中发生的意外事件&#xff0c;这些事件通常中断了正常的指令流程。它们可能是由于错误的输入数据、资源不足、非法操作或其他未预料到的情况引起的。Python中&#xff0c;当遇到这类情况时&#xff0c;会抛出一个异常对象&#…

最详细的Selenium+Pytest自动化测试框架实战

前言 selenium自动化 pytest测试框架 本章你需要 一定的python基础——至少明白类与对象&#xff0c;封装继承 一定的selenium基础——本篇不讲selenium&#xff0c; 测试框架简介 测试框架有什么优点呢&#xff1a; 代码复用率高&#xff0c;如果不使用框架的话&#xff…

一个虚拟空间可以放多个不同类型的网站吗

通常一些个人站长或者公司可能同时拥有几个网站&#xff0c;由于其他几个网站流量不高&#xff0c;而每个网站都租用一个虚拟主机空间的话&#xff0c;感觉有点浪费。大家可能会想虚拟主机能不能也像独立服务器那样放置多个网站呢&#xff1f;答案是肯定的&#xff0c;确定主机…

2004年-2022年 全国31省市场分割指数数据

市场分割指数在经济学领域是一个关键的概念&#xff0c;特别是在评估不同区域市场一体化水平时。陆铭等学者深入研究了市场分割问题&#xff0c;并对市场分割指数给出了定义&#xff1a;它是一个衡量在相同时间点不同区域或同一区域在不同时间点的某类商品相对价格差异的指标。…

组合优于继承

设计模式中的组合与继承 使用组合的模式 装饰者模式&#xff08;decorator pattern&#xff09; 策略模式&#xff08;strategy pattern&#xff09; 组合模式&#xff08;composite pattern&#xff09; 使用了组合关系 使用继承的模式 模板模式&#xff08;template p…

【OpenGauss源码学习 —— (ALTER TABLE(列存修改列类型))】

ALTER TABLE&#xff08;列存修改列类型&#xff09; ATExecAlterColumnType 函数1. 检查和处理列存储表的字符集&#xff1a;2. 处理自动递增列的数据类型检查&#xff1a;3. 处理生成列的类型转换检查&#xff1a;4. 处理生成列的数据类型转换&#xff1a; build_column_defa…

复杂风控场景(反洗钱)下,一些sql解决方案

前言&#xff1a; 在工作中遇到的一些比较复杂的场景&#xff0c;一直觉得很有记录的价值&#xff0c;但是就是嫌麻烦懒得写&#xff0c;拖延症比较厉害&#xff0c;主要是怕以后忘了&#xff0c;这些问题如果做面试题的话&#xff0c;也很考验人&#xff0c;算是给自己留个备忘…

几种常见的滤波器样式

IIR Peaking Filter IIR LowShelf Filter IIR HighShelf Filter 4. IIR LowPassFilter 5. IIR HighPass Filter FIR PeakingFilter FIR LowShelf Filter 8. FIR HighShelf Filter 8. FIR LowPass Filter 10. FIR HighPass Filter

命令行中,常见mysql命令

打开终端。 连接到 MySQL 服务器&#xff08;假设你的mysql叫root&#xff09;&#xff1a; mysql -u root -p 输入密码&#xff1a; Enter password: ******** 查看所有数据库&#xff1a; mysql> SHOW DATABASES; ERROR 4031 (HY000): The client was disconnected …

操作系统入门 -- 进程的通信方式

操作系统入门 – 进程的通信方式 1.什么是进程通信 1.1 定义 进程通信就是在不同进程之间交换信息。在之前文章中可以了解到&#xff0c;进程之间相互独立&#xff0c;一般不可能互相访问。因此进程之间若需要通信&#xff0c;则需要一个所有进程都认可的共享空间&#xff0…

OpenHarmony-HDF驱动框架介绍及加载过程分析

前言 HarmonyOS面向万物互联时代&#xff0c;而万物互联涉及到了大量的硬件设备&#xff0c;这些硬件的离散度很高&#xff0c;它们的性能差异与配置差异都很大&#xff0c;所以这要求使用一个更灵活、功能更强大、能耗更低的驱动框架。OpenHarmony系统HDF驱动框架采用C语言面…

【Kafka】Kafka Broker工作流程、节点服役与退役、副本、文件存储、高效读写数据-08

【Kafka】Kafka Broker工作流程、节点服役与退役、副本、文件存储、高效读写数据 1. Kafka Broker 工作流程1.1 Zookeeper 存储的 Kafka 信息1.2 Kafka Broker总体工作流程1.2.1 Controller介绍 1.3 Broker 重要参数 2. 节点服役与退役3. Kafka副本 1. Kafka Broker 工作流程 …

GUI Guider(V1.7.2) 设计UI在嵌入式系统上的应用(N32G45XVL-STB)

目录 概述 1 使用GUI Guider 设计UI 1.1 创建页面 1.2 页面切换事件实现 1.3 生成代码和仿真 1.3.1 生成和编译代码 1.3.2 仿真UI 2 GUI Guider生成的代码结构 2.1 代码结构介绍 2.2 Project目录下的文件 3 板卡上移植UI 3.1 加载代码至工程目录 3.2 主函数中调…