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()遍历列表信息
     */
    @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.mfbz.cn/a/740212.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

G7 - Semi-Supervised GAN 理论与实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 理论知识模型实现引用、配置参数初始化权重定义算法模型模型配置模型训练训练模型 模型效果总结与心得体会 理论知识 在条件GAN中&#xff0c;判别器只用…

轻松搞定数据可视化配色,这份指南助你一臂之力!

配色是数据可视化图表的主要因素。一组合适的配色可以表达数据的重点和趋势&#xff0c;而不良的配色会削弱可视化表达的有效性。在本文中&#xff0c;我将梳理数据可视化中使用的配色板类型&#xff0c;通过案例揭示数据可视化配色技巧&#xff0c;并介绍可生成配色板的插件&a…

Day 32:503. 下一个更大的元素Ⅱ

Leetcode 503. 下一个更大的元素Ⅱ 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它…

嵌入式实验---实验七 SPI通信实验

一、实验目的 1、掌握STM32F103SPI通信程序设计流程&#xff1b; 2、熟悉STM32固件库的基本使用。 二、实验原理 1、使用STM32F103R6通过74HC595控制一位LID数码管&#xff0c;实现以下两个要求&#xff1a; &#xff08;1&#xff09;数码管从0到9循环显示&#xff1b; …

[leetcode]add-strings 字符串相加

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string addStrings(string num1, string num2) {int i num1.length() - 1, j num2.length() - 1, add 0;string ans "";while (i > 0 || j > 0 || add ! 0) {int x i > 0 ? num1[i…

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

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

基于STM32的智能健康监测手表

目录 引言环境准备智能健康监测手表系统基础代码实现&#xff1a;实现智能健康监测手表系统 4.1 数据采集模块4.2 数据处理与分析4.3 通信模块实现4.4 用户界面与数据可视化应用场景&#xff1a;健康监测与管理问题解决方案与优化收尾与总结 1. 引言 智能健康监测手表通过使…

ONLYOFFICE 8.1版本桌面编辑器深度体验:创新功能与卓越性能的结合

ONLYOFFICE 8.1版本桌面编辑器深度体验&#xff1a;创新功能与卓越性能的结合 随着数字化办公的日益普及&#xff0c;一款高效、功能丰富的办公软件成为了职场人士的必备工具。ONLYOFFICE团队一直致力于为用户提供全面而先进的办公解决方案。最新推出的ONLYOFFICE 8.1版本桌面编…

【Mysql】数据库事务-手动提交

数据库事务 ** 什么是事务** 事务是一个整体,由一条或者多条SQL 语句组成,这些SQL语句要么都执行成功,要么都执行失败, 只要有一条SQL出现异常,整个操作就会回滚,整个业务执行失败。 比如: 银行的转账业务,张三给李四转账500元 , 至少要操作两次数据库, 张三 -500, 李四 50…

国产的浏览器我就喜爱这一款,它比微软的edge更让人喜爱

小编最近在用Yandex搜索引擎&#xff0c;这个基本上追剧找资料&#xff0c;看漫画什么的都是用到它&#xff08;dddd&#xff09; 有小伙伴就说了&#xff0c;这搜索引擎确实好用&#xff0c;但是不够方便呀&#xff0c;就很多浏览器都不能将它设置为默认引擎进行使用&#xf…

【ONLYOFFICE深度探索】:ONLYOFFICE桌面编辑器8.1震撼发布,打造高效办公新境界

文章目录 一、功能完善的PDF编辑器&#xff1a;解锁文档处理新维度二、幻灯片版式设计&#xff1a;释放创意&#xff0c;打造专业演示三、改进从右至左显示&#xff1a;尊重多元文化&#xff0c;优化阅读体验四、新增本地化选项&#xff1a;连接全球用户&#xff0c;跨越语言障…

详解Spring AOP(一)

目录 1. AOP概述 2.Spring AOP快速入门 2.1引入AOP依赖 2.2编写AOP程序 3.Spring AOP核心概念 3.1切点&#xff08;PointCut&#xff09; 3.2连接点&#xff08;Join Point&#xff09; 3.3通知&#xff08;Advice&#xff09; 3.4切面&#xff08;Aspect&#xff09; …

JDBC的概念 ,核心API的介绍 , 注册驱动介绍

第一章 JDBC 1、JDBC的概念 目标 能够掌握JDBC的概念能够理解JDBC的作用 讲解 客户端操作MySQL数据库的方式 使用第三方客户端来访问MySQL&#xff1a;SQLyog、Navicat 使用MySQL自带的命令行方式 通过Java来访问MySQL数据库&#xff0c;今天要学习的内容 如何通过Java代…

时间?空间?复杂度??

1.什么是时间复杂度和空间复杂度&#xff1f; 1.1算法效率 算法效率分析分为两种&#xff1a;第一种是时间效率&#xff0c;第二种是空间效率。时间效率被称为时间复杂度&#xff0c;而空间效率被称为空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度&#xff0c;而空…

会声会影视频剪辑软件教程之剪辑软件波纹在哪 剪辑软件波纹怎么去掉 波纹剪辑是什么意思

波纹效果做不好&#xff0c;那一定是剪辑软件没选对。一款好用的视频剪辑软件&#xff0c;一定拥有多个制作波纹效果的方法。用户可以根据剪辑创作的需要&#xff0c;挑选最适合作品的波纹效果来使用。有关剪辑软件波纹在哪&#xff0c;剪辑软件波纹怎么去掉的问题&#xff0c;…

使用Fiddler如何创造大量数据

在调试和分析网络流量时&#xff0c;您是否曾为无法深入了解请求和响应的数据而感到困惑&#xff1f;如果有一种工具可以帮助您轻松抓取和分析网络流量&#xff0c;您的工作效率将大大提升。Fiddler正是这样一款功能强大的抓包工具&#xff0c;广受开发者和测试人员的青睐。 Fi…

【日常开发之Windows共享文件】Java实现Windows共享文件上传下载

文章目录 Windows 配置代码部分Maven代码 Windows 配置 首先开启服务&#xff0c;打开控制面板点击程序 点击启用或关闭Windows功能 SMB1.0选中红框内的 我这边是专门创建了一个用户 创建一个文件夹然后点击属性界面&#xff0c;点击共享 下拉框选择你选择的用户点击添加…

CSS规则——font-face

font-face 什么是font-face&#xff1f; 想要让网页文字千变万化&#xff0c;仅靠font-family还不够&#xff0c;还要借助font-face&#xff08;是一个 CSS 规则&#xff0c;它允许你在网页上使用自定义字体&#xff0c;而不仅仅是用户系统中预装的字体。这意味着你可以通过提…

Vue父组件mounted执行完后再执行子组件mounted

// 创建地图实例 this.map new BMap.Map(‘map’) } } ... 现在这样可能会报错&#xff0c;因为父组件中的 map 还没创建成功。必须确保父组件的 map 创建完成&#xff0c;才能使用 this.$parent.map 的方法。 那么&#xff0c;现在的问题是&#xff1a;如何保证父组件 mo…

全空间数据处理

高精度三维数据往往因为体量巨大、数据标准不一、高保密性要求等&#xff0c;给数据的后期储存、处理、分析及展示造成巨大困扰。多源异构数据的客观存在性与数据无缝融合的困难性&#xff0c;为空间信息数据和业务过程中其他文件的有效管理与共享制造了诸多障碍。 随着数字孪…
最新文章