Optional的使用(代替if判断是否为空)

Optional

前言

我的使用

package yimeng;

import com.ruoyi.RuoYiApplication;
import com.ruoyi.common.core.domain.entity.SysUser;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.*;

@SpringBootTest(classes = RuoYiApplication.class)
public class MyTest2 {
    @Test
    public void testOptional() {
        List<SysUser> list=new ArrayList<>();
        SysUser sysUser1=new SysUser(1L,"张三");
        SysUser sysUser2=new SysUser(1L,"李四");
        SysUser sysUser3=new SysUser(3L,"王五");
        list.add(sysUser1);
        list.add(sysUser2);
        list.add(sysUser3);
        Optional<SysUser> optionalSysUser = list.stream().filter((item) -> item.getUserId().compareTo(1L) == 0L).findFirst();
        SysUser sysUser = optionalSysUser.get();
        System.out.println(sysUser);//打印了“张三”这个用户
    }
}

雨泽的使用

在这里插入图片描述

package yimeng;

import com.ruoyi.RuoYiApplication;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.system.mapper.SysUserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;


@SpringBootTest(classes = RuoYiApplication.class)
public class MyTest2 {

    @Resource
    private SysUserMapper sysUserMapper;
    @Test
    public void testOptional2() {
        SysUser sysUser = sysUserMapper.selectUserById(1L);
        String s = Optional.ofNullable(sysUser)
                .map(SysUser::getUserName)
                .orElseThrow(() -> new RuntimeException("id是1L的用户为null"));
        System.out.println(s);

        SysUser sysUser1 = sysUserMapper.selectUserById(100L);
        Optional.ofNullable(sysUser1)
                .map(SysUser::getUserName)
                .orElseThrow(() -> new RuntimeException("id是100L的用户为null或者名字为null"));
    }
}

结果:

在这里插入图片描述

这里不知道他有没有走map方法。

但是通过看源码可以知道。其实他是走了map方法的,但是为什么没有抛出空指针异常呢?你null.map()了。

因为他内部把null转换了一下,你Optional.ofNullable(sysUser)返回值不是null了。所以调用map方法不会出现空指针异常。如果sysUser是空,相当于是返回一个private static final Optional<?> EMPTY = new Optional<>();的东西。

然后用这个东西去调用map方法,map方法也是先看你是不是空对应的Optional,看到是调用者是空对应的Optional,也返回一个private static final Optional<?> EMPTY = new Optional<>();,不会去执行真正map()方法中的lambda表达式的,所以看起来像是跳过了map中的逻辑直接执行了orElseThrow方法。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

探测:

在这里插入图片描述

探测:

在这里插入图片描述

ofNullable()参数为null不抛出空指针异常的原因:

在这里插入图片描述

filter()参数为null抛出空指针异常的原因:

在这里插入图片描述

在这里插入图片描述

API详细介绍

Optional 就相当于是一个对象容器。

初始化方法

of(T t)

功能:创建Optional实例

注意:创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException 。

    @Test
    public void test(){
        // 创建Optional实例:参数非null
        Optional<String> notNullOptional = Optional.of("xiaoxian");
        System.out.println(notNullOptional);

        // 创建Optional实例:参数为null,抛出 NullPointerException
        try {
            Optional<String> nullOptional = Optional.of(null);
        } catch (NullPointerException e) {
            System.out.println("【of()】" + e.getMessage());
            // 输出:java.lang.NullPointerException
            e.printStackTrace();
        }
    }

在这里插入图片描述

探测:

在这里插入图片描述

在这里插入图片描述

探测:

在这里插入图片描述

探测:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

ofNullable(T t)

功能:创建Optional实例

注意:如果指定的值为null,则返回一个空的Optional。

@Test
public void test(){
    // ofNullable()与of()相似,区别在于:ofNullable()是可以接受参数为null的情况。

    // 创建Optional实例:参数非null
    Optional<String> notNullOptional = Optional.ofNullable("xiaoxian");

    // 创建Optional实例:参数为null,不会报错,返回一个空的Optional实例
    Optional<String> nullOptional = Optional.ofNullable(null);
}

在这里插入图片描述

empty()

功能:创建空的Optional实例

    @Test
    public void test(){
        Optional<String> emptyOptional = Optional.empty();
        System.out.println(emptyOptional);
    }

在这里插入图片描述

在这里插入图片描述

获取

get()
    @Test
    public void test(){
        Optional<String> notNullOptional = Optional.ofNullable("xiaoxian");
        System.out.println(notNullOptional.get());

        Optional<String> emptyOptional = Optional.empty();
        System.out.println(emptyOptional.get());
    }

get():获取optional容器中的对象,当optional 容器为空时报错。返回值为容器中那个对象的类型。

在这里插入图片描述

探测:

在这里插入图片描述

因为get方法,返回的是Optional对象声明时的那个泛型,不是返回一个Optional对象,所以get()后无法使用Optional的orElseThrow方法。

在这里插入图片描述

判断

isPresent()

isPresent():判断optional是否为空,如果空则返回false,否则返回true

@Test
public void test(){
    // 创建Optional实例:参数非null
    Optional<String> notNullOptional = Optional.ofNullable("xiaoxian");
    // 创建Optional实例:参数为null,不会报错,返回一个空的Optional实例
    Optional<String> nullOptional = Optional.ofNullable(null);

    // 输出:true
    System.out.println("【isPresent()】" + notNullOptional.isPresent());

    // 输出:false
    System.out.println("【isPresent()】" + nullOptional.isPresent());
}

在这里插入图片描述

ifPresent(Consumer consumer)

ifPresent(Consumer c):如果optional不为空,则将optional中的对象传给Comsumer函数,去执行对应的方法。如果为空,不执行什么操作。ifPresent方法的返回是void,所以也不会返回什么东西。

@Test
public void test(){
    // 创建Optional实例:参数非null
    Optional<String> notNullOptional = Optional.ofNullable("xiaoxian");

    //如果实例值非null,就执行lambda表达式,否则不处理
    notNullOptional.ifPresent(s -> {
        s = s + " love java";
        // 输出:xiaoxian love java
        System.out.println(s);
    });
}

在这里插入图片描述

Else相关

orElse()和orElseGet()

我们在初始化 Optional 对象的时候,有时候需要一个默认值,这时orElse() 和 orElseGet() 方法就派上用场了(类似三目运算符)。

orElse()功能:检查Optional容器中的对象是否是null,如果非null,就返回这个对象。否则返回你自己指定的其它值。

@Test
public void test(){
    String name = Optional.ofNullable("张三").orElse("沉默王二");
    System.out.println(name); // 输出:张三

    String nullName = null;
    String name1 = Optional.ofNullable(nullName).orElse("沉默王二");
    System.out.println(name1); // 输出:沉默王二
}

在这里插入图片描述

注意:是返回orElse方法不管,调用它的Optional是不是为空的容器,都会返回它声明的泛型的对象。不是要以为Optional.ofNullable(“张三”).orElse(“沉默王二”);返回还是Optional对象哈。看清楚上面的例子返回的是一个String,不是一个Optional对象哈。

在这里插入图片描述

orElseGet()功能:orElseGet() 方法与 orElse() 方法类似,但参数类型不同。orElseGet()方法的功能是,如果 Optional 容器中的对象为 null,则执行参数中的lambda表达式的方法。

@Test
public void test(){
    Optional<String> notNullOptional = Optional.ofNullable("xiaoxian");

    Optional<String> nullOptional = Optional.ofNullable(null);
    // orElseGet与orElse方法类似
    // 区别在于:orElse传入的是默认值,orElseGet可以接收一个lambda表达式生成默认值

    //如果Optional实例值非null,返回Optional的值
    // 输出:xiaoxian
    System.out.println("【orElseGet()】" + notNullOptional.orElseGet(() -> "Default Value"));

    //如果Optional实例值为null,返回lambda表达式的值
    // 输出:Default Value
    System.out.println("【orElseGet()】" + nullOptional.orElseGet(() -> "Default Value"));
}

在这里插入图片描述

从输出结果以及代码的形式上来看,这两个方法极其相似,这不免引起我们的怀疑,Java 类库的设计者有必要这样做吗?

假设现在有这样一个获取默认值的方法,很传统的方式

public static String getDefaultValue() {
    System.out.println("getDefaultValue");
    return "沉默王二";
}

然后,通过 orElse() 方法和 orElseGet() 方法分别调用 getDefaultValue() 方法返回默认值

public static void main(String[] args) {
    String name = null;
    System.out.println("orElse");
    String name2 = Optional.ofNullable(name).orElse(getDefaultValue());

    System.out.println("orElseGet");
    String name3 = Optional.ofNullable(name).orElseGet(Demo::getDefaultValue);
}

注:类名 :: 方法名是 Java 8 引入的语法,方法名后面是没有 () 的,表明该方法并不一定会被调用

输出结果如下所示:

orElse
getDefaultValue

orElseGet
getDefaultValue

输出结果是相似的,没什么太大的不同,这是在 Optional 对象的值为 null 的情况下。假如 Optional 对象的值不为 null 呢?

public static void main(String[] args) {
    String name = "沉默王三";
    System.out.println("orElse");
    String name2 = Optional.ofNullable(name).orElse(getDefaultValue());

    System.out.println("orElseGet");
    String name3 = Optional.ofNullable(name).orElseGet(OrElseOptionalDemo::getDefaultValue);
}

输出结果如下所示:

orElse
getDefaultValue
orElseGet

在Optional容器中的对象不是null时,orElseGet() 并没有去调用 getDefaultValue()方法,而orElse方法还是会去调用的,只是返回值没有被使用而已。所以orElseGet方法的性能更佳。

直观从语义上来看,get() 方法才是最正宗的获取 Optional 对象值的方法,但很遗憾,该方法是有缺陷的,因为假如 Optional 容器中的值为 null,该方法会抛出 NoSuchElementException 异常。这完全与我们使用 Optional 类的初衷相悖。我们使用 Optional 其实就是为了防止异常。主要是防止空指针异常。如果是空的话,会把null转换为对应的Optional,所以不会出现空指针异常,你使用Optional的get方法,如果Option容器中的对象为null,就会抛出NoSuchElementException 异常,虽然这个不是空指针异常,但是也是异常,所以不建议使用Optional的get方法。

orElseThrow()

功能:检查Optional容器中的实例是否为null,如果容器中实例值非null,就不做任何处理,如果是null,则抛异常Exception

@Test
public void test(){
    Optional<String> notNullOptional = Optional.ofNullable("xiaoxian");

    Optional<String> nullOptional = Optional.ofNullable(null);
    // orElseThrow与orElse方法类似
    // 区别在于:orElse传入的是默认值,orElseThrow会抛出他参数中的lambda表达式或方法生成的异常
    try {
        //如果Optional实例值非null,不做任何处理,不会执行orElseThrow()内的方法。
        notNullOptional.orElseThrow(Exception::new);
    } catch (Exception e) {
        e.printStackTrace();
    }

    try {
        //如果Optional实例值为null,会执行orElseThrow()内对象的方法。并且这个orElseThrow内对象的方法必须是可以抛的,即异常对象。
        nullOptional.orElseThrow(Exception::new);
    } catch (Throwable e) {
        // 输出: null
        System.out.println("【orElseThrow()】" + e.getMessage());
        e.printStackTrace();
    }
}

在这里插入图片描述

探测:

在这里插入图片描述

看到orElseThrow方法中的对象的get方法的返回值必须是一个可被抛出的对象,所以orElseThrow方法中对象的方法都是创建一个异常类。(Supplier他就一个方法,如果是lambda表达式,那么lambda表达式中的方法体就是这个get方法的方法体,这是lambda表达式的知识点。)

在这里插入图片描述

过滤

filter(Predicate p)

filter(Predicate p):如果optional容器中的对象不为空,则执行断言函数p,如果p的结果为true,则返回原本的optional,否则返回空的optional。如果optional容器中的对象为空,那么也返回空的Optional。

@Test
public void test(){
    Optional<String> notNullOptional = Optional.ofNullable("xiaoxian");
    //如果是空,就返回空Optional
    Optional<String> nullOptional = Optional.ofNullable(null);
    Optional<String> aaa = nullOptional.filter(item -> item.equals("kkk"));
    System.out.println(aaa);
    // 如果不是空,且满足filter条件,则返回该Option容器中的对象实例,否则返回空Optional。value就是指Optional容器中的对象。
    Optional<String> filterTrue = notNullOptional.filter((value) -> value.length() > 6);
    //输出:xiaoxian
    System.out.println("【filter】" + filterTrue.orElse("不滿足filter條件"));

    //如果不是空,且不满足filter条件,则返回空Optional。value就是指Optional容器中的对象。
    Optional<String> filterFalse = notNullOptional.filter((value) -> value.length() > 10);
    //输出:【filter】Optional.empty
    System.out.println("【filter】" + filterFalse);
}

在这里插入图片描述

映射

map(Function<T, U> mapper)

map(Function<T, U> mapper):如果optional容器中对象不为空,则将optional中的对象 t 映射成另外一个对象 u,并将 u 存放到一个新的optional容器中。否则返回空Optional。

@Test
public void test(){
    Optional<String> notNullOptional = Optional.ofNullable("xiaoxian");
    //如果是空,就返回空Optional
    Optional<String> nullOptional = Optional.ofNullable(null);
    // 如果Optional实例值非null,执行map(lambda表达式,任意类型),返回新的Optional实例

    Optional<String> notNullToUpperCase = notNullOptional.map((value) -> value.toUpperCase());
    // 输出:map后是一个新的Optional对象
    System.out.println(notNullOptional==notNullToUpperCase?"是一个对象":"map后是一个新的Optional对象");
    // 输出:XIAOXIAN
    System.out.println("【map()】" + notNullToUpperCase.orElse("No value found"));

    Optional<Integer> notNullToInteger = notNullOptional.map((value) -> 1);
    // 输出:1
    System.out.println("【map()】" + notNullToInteger.orElse(2));

    // 如果Optional实例值为null,不用执行map(),返回空Optional
    Optional<String> emptyToUpperCase = nullOptional.map((value) -> value.toUpperCase());
    // 输出:No value found
    System.out.println("【map()】" + emptyToUpperCase.orElse("No value found"));
}

在这里插入图片描述

flatMap(Function< T,Optional< U >> mapper)

flatMap():flatMap()与 map()类似,区别在于:他们传入方法的lambda表达式的返回类型

map():lambda表达式返回值可以是任意类型,在map函数返回之前会包装为Optional
flatMap:lambda表达式返回值必须是Optionl实例,不会自动把结果包装为Optional,需要你手动把返回值封装为Optional才行。

@Test
public void test(){
    Optional<String> notNullOptional = Optional.ofNullable("xiaoxian");
    //如果是空,就返回空Optional
    Optional<String> nullOptional = Optional.ofNullable(null);

    // flatMap()与 map()类似,区别在于:传入方法的lambda表达式的返回类型
    //      map():lambda表达式返回值可以是任意类型,在map函数返回之前会包装为Optional
    //      flatMap:lambda表达式返回值必须是Optionl实例,不会把结果包装为Optional

    //如果Optional容器中对象的值非null,执行flatMap(lambda表达式),但是注意得返回一个Optional类型的返回值
    Optional<String> notNullToUpperCase = notNullOptional.flatMap((value) -> Optional.of(value.toUpperCase()));
    // 输出:XIAOXIAN
    System.out.println("【flatMap()】" + notNullToUpperCase.orElse("No value found"));

    //如果Optional容器中实例的值为null,不用执行flatMap(lambda表达式),返回空Optional
    Optional<String> optional = nullOptional.flatMap((value) -> Optional.of(value.toUpperCase()));
    // 输出:No value found
    System.out.println("【flatMap()】" + optional.orElse("No value found"));
}

在这里插入图片描述

使用推荐

1、如果实例值不为null,就返回值,否则为null

    // 之前写法
    User user1 = userOptional.isPresent() ? userOptional.get() : null;

    // 推荐写法
    User user2 = userOptional.orElse(null);

2、如果实例值不为null,就返回值,否则进行指定操作

    // 之前写法
    User user3 = userOptional.isPresent() ? userOptional.get(): getUser();

    // 推荐写法
    User user4 = userOptional.orElseGet(() -> getUser());

3、如果实例值不为null,就进行指定操作

    // 之前写法
    if (userOptional.isPresent()) {
        System.out.println(userOptional.get());
    }
    // 推荐写法
    userOptional.ifPresent(System.out::println);
    // 之前写法
    if (userOptional.isPresent()) {
        getUser();
    }
    // 推荐写法
    userOptional.ifPresent(e->getUser());

4、如果实例值不为null,就获取实例值,并进行指定操作

    // 之前写法
    List<String> list = null;
    if(userOptional.isPresent()) {
        list = userOptional.get().getCourseList();
    } else {
        list = Collections.emptyList();
    }

    // 推荐写法
    list = userOptional.map(u -> u.getCourseList()).orElse(Collections.emptyList());
    // 之前写法
    getName(new User("xiaoxian"));

    // 推荐写法
    getNameNew(new User("xiaoxian"));

    public static String getName(User user){
        if(user != null) {
            String name = user.getName();
            if(name != null) {
                return name.toUpperCase();
            } else {
                return null;
            }
        } else {
            return null;
        }
    }

    public static String getNameNew(User user){
        Optional<User> userOptional = Optional.ofNullable(user);
        return userOptional.map(u -> u.getName())
                .map(name -> name.toUpperCase())
                .orElse(null);
    }

推荐示例代码

import java.util.Collections;
import java.util.List;

public class UseOptional {
    public static User getUser() {
        return new User("xiaoxian");
    }

    public static void main(String[] args) {

        Optional<User> userOptional = Optional.of(new User("xiaoxian"));

        // 之前写法
        User user1 = userOptional.isPresent() ? userOptional.get() : null;

        // 推荐写法
        User user2 = userOptional.orElse(null);

        // 之前写法
        User user3 = userOptional.isPresent() ? userOptional.get() : getUser();
        // 推荐写法
        User user4 = userOptional.orElseGet(() -> getUser());

        // 之前写法
        if (userOptional.isPresent()) {
            System.out.println(userOptional.get());
        }
        // 推荐写法
        userOptional.ifPresent(System.out::println);

        // 之前写法
        if (userOptional.isPresent()) {
            getUser();
        }
        // 推荐写法
        userOptional.ifPresent(e -> getUser());

        // 之前写法
        List<String> list = null;
        if (userOptional.isPresent()) {
            list = userOptional.get().getCourseList();
        } else {
            list = Collections.emptyList();
        }

        // 推荐写法
        list = userOptional.map(u -> u.getCourseList()).orElse(Collections.emptyList());

        // 之前写法
        getName(new User("xiaoxian"));

        // 推荐写法
        getNameNew(new User("xiaoxian"));


    }

    public static String getName(User user) {
        if (user != null) {
            String name = user.getName();
            if (name != null) {
                return name.toUpperCase();
            } else {
                return null;
            }
        } else {
            return null;
        }
    }

    public static String getNameNew(User user) {
        Optional<User> userOptional = Optional.ofNullable(user);
        return userOptional.map(u -> u.getName()).map(name -> name.toUpperCase()).orElse(null);
    }
}

class User {
    public String name;
    public List<String> courseList;

    public User() {
    }

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public List<String> getCourseList() {
        return courseList;
    }
}

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

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

相关文章

常用电子器件学习——三极管

三极管介绍 三极管&#xff0c;全称应为半导体三极管&#xff0c;也称双极型晶体管、晶体三极管&#xff0c;是一种电流控制电流的半导体器件其作用是把微弱信号放大成幅度值较大的电信号&#xff0c; 也用作无触点开关。晶体三极管&#xff0c;是半导体基本元器件之一&#xf…

专业140+总分420+复旦大学957信号与系统考研经验复旦电子信息与通信

今年专业957信号与系统140&#xff0c;数二140&#xff0c;总分420&#xff0c;顺利上岸复旦大学&#xff0c;回顾这一年的复习&#xff0c;有起有落&#xff0c;也有过犹豫和放弃&#xff0c;好在都坚持下来了&#xff0c;希望大家考研复习要不忘初心&#xff0c;困难肯定是很…

explain工具优化mysql需要达到什么级别?

explain工具优化mysql需要达到什么级别&#xff1f; 一、explain工具是什么&#xff1f;二、explain查询后各字段的含义三、explain查询后type字段有哪些类型&#xff1f;四、type类型需要优化到哪个阶段&#xff1f; 一、explain工具是什么&#xff1f; explain是什么&#x…

未来已来:AI引领智能时代的多领域巨变

大家好&#xff0c;今天我们将深入探讨人工智能如何彻底改变我们的生活方式&#xff0c;领略未来的无限可能性。 1. 医疗革新&#xff1a;AI担任超级医生 医疗领域是AI最引人注目的战场之一。智能医学影像诊断系统&#xff0c;不仅能够精准识别病变&#xff0c;还能辅助医生提…

Springboot+vue的科研工作量管理系统的设计与实现(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的科研工作量管理系统的设计与实现&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的科研工作量管理系统的设计与实现…

浅谈大数据智能化技术在多个领域的应用实践

摘要 大数据智能化技术在当今信息社会中得到了广泛的应用。从金融、互联网电商、视频行业到垂直短视频领域&#xff0c;从工业互联网到云计算、边缘计算等领域&#xff0c;大数据智能化技术已经成为了企业竞争力的重要组成部分。技术实践、架构设计、指标体系、数据质量、数据分…

历经15年,比特币以强势姿态进军华尔街!270亿美元投资狂潮引发市场震荡!

本月&#xff0c;比特币庆祝了它的15岁生日&#xff0c;并以强势的姿态进军华尔街。最近美国交易所开始交易的比特币交易所交易基金&#xff08;ETF&#xff09;&#xff0c;已经获得了投资者的广泛接受。这一进展标志着比特币作为一种年轻资产迈向成熟的重要里程碑。 根据Glas…

损失函数是指什么

损失函数&#xff08;Loss Function&#xff09;是用来衡量模型预测输出与实际目标之间差异的函数。在机器学习和深度学习中&#xff0c;损失函数是模型训练的关键部分。其目标是通过最小化损失函数来使模型的预测尽可能接近实际的标签或目标值。 在监督学习中&#xff0c;模型…

JavaEE-SSM-订单管理-前端增删改功能实现

3.5 功能2&#xff1a;添加 从列表页面切换到添加页面 编写对应添加页面的路由 * {path: /orderAdd,name: 添加订单,component: () > import(../views/OrderAdd.vue)}编写添加功能 <template><div><table border"1"><tr><td>编…

mysql临时表简述

概述 业务中经常会对一些表进行聚合组装信息&#xff0c;然后筛选&#xff0c;有些表比较数据量大的时候&#xff0c;会对拖慢查询&#xff1b; 常用的mybatis的分页查询&#xff0c;在查询时会先count一下所有数据&#xff0c;然后再limit分页&#xff0c;即使分页也会有深度…

数美滑块协议解析2024/01/24

文章目录 网址分析请求定位代码看算法扣代码传参和轨迹暗坑网址 aHR0cHM6Ly93d3cuaXNodW1laS5jb20vbmV3L3Byb2R1Y3QvdHcvY29kZQ==分析请求 我比较简单,我直接过一下滑块然后看一下请求栈,是一堆混淆后的代码,直接全部拿下来,简单做一下解混淆,方便自己看,不会解混淆的也…

.kann勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言&#xff1a; 随着网络犯罪日益猖獗&#xff0c;恶意软件攻击也呈现多样化趋势。.kann勒索病毒是一种采用高级加密技术的勒索软件&#xff0c;它能够使用户的个人文件和企业数据变得无法访问。本文91数据恢复将介绍.kann勒索病毒的特点、数据恢复方法以及预防策略。如果您…

Onvif协议1:gSOAP是什么

目录 1.简介 2. Web Services 2.1 Web Services常用的几种框架 3. SOAP简介 3.1如此理解SOAP 4. WSDL文档 5. gsoap编译 5.1 gSOAP工具转换原理 1.简介 gSOAP工具基于编译器技术为C/C提供自动的SOAP和XML数据绑定。该工具使用自动生成代码以及先进的映射方法&#xff…

springboot118共享汽车管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的共享汽车管理系统 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获…

如何在Linux上部署Docker容器

一、什么是docker&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不…

Vue+Element(el-upload+el-form的使用)+springboot

目录 1、编写模板 2、发请求调接口 3、后端返回数据 1.编写实体类 2.Controller类 3、interface接口&#xff08;Service层接口&#xff09; 4.Service&#xff08;接口实现&#xff09; 5、interface接口&#xff08;Mapper层接口&#xff09; 6、xml 4、upload相关参…

别不信❗️你离数据专家只差一个CDMP证书

1⃣️为什么选择CDMP证书&#xff1f; &#x1f31f;&#x1f31f;亲爱的朋友们&#xff0c;如果你在寻找一个能让你在数据管理领域大展拳脚的证书&#xff0c;那么CDMP&#xff08;Certified Data Management Professional&#xff09;证书就是你的不二之选&#xff01;&#…

【数据结构】链表的分类和双向链表

本篇是基于上篇单链表所作&#xff0c;推荐与上篇配合阅读&#xff0c;效果更加 http://t.csdnimg.cn/UhXEj 1.链表的分类 链表的结构非常多样&#xff0c;以下情况组合起来就有8种&#xff08;2 x 2 x 2&#xff09;链表结构&#xff1a; 我们一般叫这个头为哨兵位 我们上回…

树,二叉树及其相关知识

1.树概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#…

搭建《幻兽帕鲁》服务器需要怎样配置的云服务器?

随着《幻兽帕鲁》这款游戏的日益流行&#xff0c;越来越多的玩家希望能够在自己的服务器上体验这款游戏。然而&#xff0c;搭建一个稳定、高效的游戏服务器需要仔细的规划和配置。本文将分享搭建《幻兽帕鲁》服务器所需的配置及搭建步骤&#xff0c;助力大家获得更加畅快的游戏…