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

news2024/11/15 6:45:13

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()遍历列表信息
     */
    @Test
    public 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()过滤列表数据
     */
    @Test
    public 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() :获取第一条数据
     */
    @Test
    public void filterAnyTest(){
        //获取用户列表
        List<User> userList = userService.getUserList();
        //获取用户名称为'张三'的用户信息,如果没有找到则返回null
        User 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()获取列元素
     */
    @Test
    public 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()将流中的每一个元素连接成为一个流
     */
    @Test
    public 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()去除重复的数据
     */
    @Test
    public 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)
     */
    @Test
    public 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() 进行判断
     */
    @Test
    public 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() 求用户列表中年龄的最大值、最小值、总和
     */
    @Test
    public 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() 求用户列表中年龄的最大值、最小值、总和、平均值
     */
    @Test
    public 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() 统计
     */
    @Test
    public 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() 计算总和
     */
    @Test
    public 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() 计算平均值
     */
    @Test
    public 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 统计:最大值、最小值、总和、平均值、总数
     */
    @Test
    public 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类型的统计
     */
    @Test
    public 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() 分组
     */
    @Test
    public 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() 多级分组
     */
    @Test
    public 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() 分组汇总
     */
    @Test
    public 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 并集

    /**
     * 得到两个集合的并集
     */
    @Test
    public 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 交集

    /**
     * 得到两个集合的交集
     */
    @Test
    public 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.coloradmin.cn/o/1858190.html

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

相关文章

OS中断机制-外部中断触发

中断函数都定义在中断向量表中,外部中断通过中断跳转指令触发中断向量表中的中断服务函数,中断指令可以理解为由某个中断寄存器的状态切换触发的汇编指令,这个汇编指令就是中断跳转指令外部中断通过在初始化的时候使能对应的中断服务函数如何判断外部中断被触发的条件根据Da…

【C++进阶之路】C++11——正则表达式

序言 正则表达式&#xff0c;简而言之就是用来匹配指定模式字符串的工具&#xff0c;在计算机的世界中&#xff0c;它发挥着很大的作用&#xff0c;比如编译器的词法分析&#xff0c;注册时验证密码的复杂度&#xff0c;爬虫爬取固定格式的数据时等场景都要用到。那么本篇的目的…

超市库存管理系统

本系统主要利用C#和SQL建立系统,主要实现一下几个功能:登录、商品管理、供应商管理、库存管理、查询统计和系统管理几个模块。 1.数据库设计 总共有6个表,表名取得比较随意,专业人士开发最好用对应的英文。 用户表(sys_user) 用户表有3个字段:分别为用户名(userName…

如何将一个web端程序打包成一个pc端程序(exe文件)?

如何将一个Web端程序打包成一个PC端程序&#xff0c;例如一个可执行的EXE文件&#xff0c;是许多开发者常见的需求。下面将详细解释如何使用Nativefier工具将Web端程序打包成PC端程序的具体步骤。 目录 下载并安装Node.js验证Node.js和npm的安装安装Nativefier使用Nativefier打…

近2年时间,华为手机上的卫星通信功能发展成怎样了?

自从Mate 50 系列支持北斗卫星短报文功能以来&#xff0c;已经过去了近2年的时间&#xff0c;卫星相关的功能也从最开始的摸索、罕见&#xff0c;逐渐变得成熟、在各品牌旗舰机上常见起来。 那么&#xff0c;这近两年的发展&#xff0c;卫星相关的功能都有了怎样的变化呢&…

HarmonyOS NEXT的发布不仅打破了技术垄断,还保护了国人数据安全

吉祥学安全知识星球&#x1f517;除了包含技术干货&#xff1a;Java代码审计、web安全、应急响应等&#xff0c;还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 01-HarmonyOS NEXT 前几天华为发布了最新的鸿蒙…

P8813 [CSP-J 2022] 乘方

题目&#xff1a; P8813 [CSP-J 2022] 乘方 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 提交记录&#xff1a; 记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 个人主页&#xff1a; xuzb 的个人中心 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) AC代码&…

Calibre - 翻译电子书(Ebook Translator)

本文参考教程 &#xff1a;https://bookfere.com/post/1057.html 使用 Ebook Translator 插件&#xff0c;详见&#xff1a; 官网&#xff1a;https://translator.bookfere.comgithub &#xff1a;https://github.com/bookfere/Ebook-Translator-Calibre-Plugin 一、基本翻译 …

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的数字游戏(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

链在一起Chained Together没中文 超好用的一键汉化工具推荐

《链在一起》一款新的可联机冒险跑酷类游戏&#xff0c;游戏里玩家将与你的同伴被链在一起&#xff0c;然后开始你的旅程&#xff0c;在地狱的深处&#xff0c;任务是通过尽可能高的攀登逃离地狱。 每一次跳跃都需要完美的协调才能攀上平台并逃离灼热&#xff0c;穿越众多世界&…

哈哈,CloudFlare 赛博菩萨威武呀,真是想啥来啥!

就在今天明月发现 CloudFlare 赛博菩萨又免费增加了一个新功能&#xff0c;对于广大原创内容为主的博客站长来说是绝对的利好&#xff0c;那就是专门针对 AI 爬虫的自动阻止机器人抓取您的内容以用于模型训练等人工智能应用程序正式上线了。如下图所示&#xff1a; 只需要在 Cl…

【机器学习】机器学习重要方法——深度学习:理论、算法与实践

文章目录 引言第一章 深度学习的基本概念1.1 什么是深度学习1.2 深度学习的历史发展1.3 深度学习的关键组成部分 第二章 深度学习的核心算法2.1 反向传播算法2.2 卷积神经网络&#xff08;CNN&#xff09;2.3 循环神经网络&#xff08;RNN&#xff09; 第三章 深度学习的应用实…

03 Shell编程之循环语句与函数

目录 3.1 for 循环语句 3.1.1 for 语句的结构 3.1.2 for 语句应用示例 1. 根据姓名列表批量添加用户 2. 根据IP地址列表检查主机状态 3.2 使用while循环语句 3.2.1 while语句的结构 3.2.2 while语句应用示例 1. 批量添加规律编号的用户 2. 猜价格游戏 3.3 until 循环语句 3.…

[word] word 如何在文档中进行分栏排版? #媒体#其他#媒体

word 如何在文档中进行分栏排版&#xff1f; 目标效果 将唐代诗人李白的组诗作品《清平调词》进行分栏排版&#xff0c;共分三栏&#xff0c;每一首诗作为一栏&#xff0c;参考效果如下图。

策略模式 + 抽象工厂实现多方式登录验证

文章目录 1、需求背景2、常规想法3、工厂模式 配置文件解耦 策略模式4、具体实现5、其他场景6、一点思考 1、需求背景 以gitee为例&#xff0c;登录验证的方式有多种&#xff1a; 用户名密码登录短信验证码登录微信登录 先写一个登录接口&#xff0c;适配所有方式&#xff…

如何使能PCIe的ASPM?

1. ASPM概述 PCIe总线的电源管理包含ASPM(Active State Power Management)和软件电源管理两方面内容。所谓的ASPM是指PCIe链路在没有系统软件参与的情况下&#xff0c;由PCIe链路自发进行的电源管理方式。如下是PCIe的ASPM的状态机&#xff0c;其L1是强制性的规定&#xff0c;…

Redis入门与应用(1)

Redis的技术全景 Redis是一个开源的基于键值对&#xff08;Key-Value&#xff09;的NoSQL数据库&#xff0c;使用ANSI C语言编写&#xff0c;支持网络&#xff0c;基于内存但支持持久化。它性能优越&#xff0c;并提供多种语言的API。我们可以将Redis视为一个巨大的Map&#x…

Linux 字符型设备 + platform总线 + sysfs设备模型

1 概述 第一部分先简单介绍下字符型设备 platform总线 sysfs设备模型的关系。 1.1 . 字符设备驱动 Linux设备驱动分三种&#xff0c;包括字符设备驱动、块设备驱动和网络设备驱动。字符设备只能按字节流先后顺序访问设备内存&#xff0c;不能随机访问。鼠标、触摸屏、LCD等…

Part 5.2 KMP

KMP 算法可以用来解决模式串匹配问题。 【模板】KMP 题目描述 给出两个字符串 s 1 s_1 s1​ 和 s 2 s_2 s2​&#xff0c;若 s 1 s_1 s1​ 的区间 [ l , r ] [l, r] [l,r] 子串与 s 2 s_2 s2​ 完全相同&#xff0c;则称 s 2 s_2 s2​ 在 s 1 s_1 s1​ 中出现了&…

MQTTX 1.10.0 发布:CLI高级文件管理与配置

MQTTX 1.10.0 版本现已发布&#xff01; 在本次更新中&#xff0c;CLI 版本在文件管理和配置功能方面进行了显著增强。主要更新包括&#xff1a;支持从文件中读取和写入消息、高级配置选项、文本输出模式、以及改进的日志记录。此外&#xff0c;桌面版本现在支持数据库重建&am…