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 {@Testpublic 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 {@Resourceprivate SysUserMapper sysUserMapper;@Testpublic 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 。

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

在这里插入图片描述

探测:

在这里插入图片描述

在这里插入图片描述

探测:

在这里插入图片描述

探测:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

ofNullable(T t)

功能:创建Optional实例

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

@Test
public void test(){// ofNullable()与of()相似,区别在于:ofNullable()是可以接受参数为null的情况。// 创建Optional实例:参数非nullOptional<String> notNullOptional = Optional.ofNullable("xiaoxian");// 创建Optional实例:参数为null,不会报错,返回一个空的Optional实例Optional<String> nullOptional = Optional.ofNullable(null);
}

在这里插入图片描述

empty()

功能:创建空的Optional实例

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

在这里插入图片描述

在这里插入图片描述

获取

get()
    @Testpublic 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实例:参数非nullOptional<String> notNullOptional = Optional.ofNullable("xiaoxian");// 创建Optional实例:参数为null,不会报错,返回一个空的Optional实例Optional<String> nullOptional = Optional.ofNullable(null);// 输出:trueSystem.out.println("【isPresent()】" + notNullOptional.isPresent());// 输出:falseSystem.out.println("【isPresent()】" + nullOptional.isPresent());
}

在这里插入图片描述

ifPresent(Consumer consumer)

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

@Test
public void test(){// 创建Optional实例:参数非nullOptional<String> notNullOptional = Optional.ofNullable("xiaoxian");//如果实例值非null,就执行lambda表达式,否则不处理notNullOptional.ifPresent(s -> {s = s + " love java";// 输出:xiaoxian love javaSystem.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的值// 输出:xiaoxianSystem.out.println("【orElseGet()】" + notNullOptional.orElseGet(() -> "Default Value"));//如果Optional实例值为null,返回lambda表达式的值// 输出:Default ValueSystem.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
getDefaultValueorElseGet
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) {// 输出: nullSystem.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");//如果是空,就返回空OptionalOptional<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);//输出:xiaoxianSystem.out.println("【filter】" + filterTrue.orElse("不滿足filter條件"));//如果不是空,且不满足filter条件,则返回空Optional。value就是指Optional容器中的对象。Optional<String> filterFalse = notNullOptional.filter((value) -> value.length() > 10);//输出:【filter】Optional.emptySystem.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");//如果是空,就返回空OptionalOptional<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对象");// 输出:XIAOXIANSystem.out.println("【map()】" + notNullToUpperCase.orElse("No value found"));Optional<Integer> notNullToInteger = notNullOptional.map((value) -> 1);// 输出:1System.out.println("【map()】" + notNullToInteger.orElse(2));// 如果Optional实例值为null,不用执行map(),返回空OptionalOptional<String> emptyToUpperCase = nullOptional.map((value) -> value.toUpperCase());// 输出:No value foundSystem.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");//如果是空,就返回空OptionalOptional<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()));// 输出:XIAOXIANSystem.out.println("【flatMap()】" + notNullToUpperCase.orElse("No value found"));//如果Optional容器中实例的值为null,不用执行flatMap(lambda表达式),返回空OptionalOptional<String> optional = nullOptional.flatMap((value) -> Optional.of(value.toUpperCase()));// 输出:No value foundSystem.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;}
}

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

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

相关文章

OpenCV第 2 课 OpenCV 环境搭建

文章目录 第 2 课 OpenCV 环境搭建1.安装 Numpy2.从 Ubuntu 存储库安装 OpenCV3.验证 OpenCV 安装 第 2 课 OpenCV 环境搭建 1.安装 Numpy 每一张图像都有很多个像素点&#xff0c;这也导致了程序中会涉及大量的数组处理。Numpy 是一个 Python 的拓展库&#xff0c;它对多维数…

mysql临时表简述

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

数据分析-Pandas如何用图把数据展示出来

数据分析-Pandas如何用图把数据展示出来 俗话说&#xff0c;一图胜千语&#xff0c;对人类而言一串数据很难立即洞察出什么&#xff0c;但如果展示图就能一眼看出来门道。数据整理后&#xff0c;如何画图&#xff0c;画出好的图在数据分析中成为关键的一环。 数据表&#xff…

「JavaSE」抽象类接口2

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;快来卷Java啦 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 抽象类&接口2 &#x1f349;接口间的继承&#x1f349;接口的应用&#x1f349;总结 &#x1f349;接口间的继承 和类的继承…

【每日一题】最长交替子数组

文章目录 Tag题目来源解题思路方法一&#xff1a;双层循环方法二&#xff1a;单层循环 写在最后 Tag 【双层循环】【单层循环】【数组】【2024-01-23】 题目来源 2765. 最长交替子数组 解题思路 两个方法&#xff0c;一个是双层循环&#xff0c;一个是单层循环。 方法一&am…

yarn集群HDFS datanode无法启动问题排查

一、问题场景 hdfs无法访问&#xff0c;通过jps命令查看进程&#xff0c;发现namenode启动成功&#xff0c;但是所有datanode都没有启动&#xff0c;重启集群&#xff08;start-dfs.sh&#xff09;后仍然一样 二、原因分析 先看下启动的日志有无报错。打开Hadoop的日志目录 …

线程池中线程数量与队列大小参数的如何设置实践-基于QPS的计算公式

目录 概要 传统方式? 线程池理解? 基于QPS的设置思路? 总结? 概要 线程池是个既靠谱但又陌生的家伙, 像管家一样, 会踏踏实实的把你交代的任务完成, 但很死板, 没有自动安排人的能力, 需要你给它配好人手(线程实例)和承载容量(队列大小), 这些参数关系影响业务服务整体…

rabbitmq基础-java-5、Topic交换机

1、简介 Topic类型的Exchange与Direct相比&#xff0c;都是可以根据RoutingKey把消息路由到不同的队列。 只不过Topic类型Exchange可以让队列在绑定BindingKey 的时候使用通配符&#xff01; BindingKey 一般都是有一个或多个单词组成&#xff0c;多个单词之间以.分割&#x…

使用Python的pygame库实现迷宫游戏

使用Python的pygame库实现迷宫游戏 关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520 先给出效果图&#xff1a; 这个游戏能自动生成迷宫布局。 在这个游戏中&#xff0c;玩家将使用键盘箭头键来移动&#xff0c;并且目标…

深入了解达梦数据库的增删查改操作:从入门到精通

目录 前言&#xff1a; 一.达梦数据库的增删改查 1.创建数据库 2.插入数据 3.查看数据 4.删除数据 5.数据 前言&#xff1a; 在当今数字化的时代&#xff0c;数据库已经成为企业和组织的核心资产&#xff0c;是实现高效数据处理、存储和管理的重要工具。达梦数据库&…

测试用例评审流程

1:评审的过程 A:开始前做好如下准备 1、确定需要评审的原因 2、确定进行评审的时机 3、确定参与评审人员 4、明确评审的内容 5、确定评审结束标准 6、提前至少一天将需要评审的内容以邮件的形式发送给评审会议相关人员。并注明详审时间、地点及偿参与人员等。 7、 在邮件中提醒…

科创板交易规则科普

一、交易时间&#xff1a; 交易日的上午9:30-11:30&#xff0c;下午13:00-15:00&#xff0c;其中9:15-9&#xff1a;25是开盘价公布以及竞价的时间&#xff0c;15:05-15:30是盘后固定价格交易时间。 二、买卖原则&#xff1a; 科创板实行T1交易&#xff0c;按照市场实时价格…

Linux运维实战:CentOS7.6操作系统(Shell脚本基础)

文章目录 第19章 Shell脚本基础19.1 Shell基本语法19.1.1 什么是Shell19.1.2 编程语言分类1.低级语言2.高级语言19.1.3 什么是Shell脚本19.2 Shell变量及运用19.2.1 Shell变量1.变量的设置规则如下2.按照变量的作用可以分成以下4类3.按照变量的作用域可以把变量分成两类:…

音乐证书通过率发布,市场对持有者需求旺盛

音乐证书的考试难度备受关注&#xff0c;通过率终于揭晓。据官方公布的数据&#xff0c;该证书的通过率相对较低&#xff0c;需要考生在音乐技能和表现方面有出色的表现。然而&#xff0c;持有音乐证书的人才在市场上需求旺盛&#xff0c;各种音乐机构和企业对其表现出强烈兴趣…

SpringBoot整合ElasticSearch实现分页查询

本文使用SpringBoot整合ElasticSearch实现分页查询 文章目录 环境准备分页查询方式一方式二 本文小结 环境准备 还是继续使用spring-boot-starter-data-elasticsearch来实现分页查询操作 <!-- spring-boot-starter-data-elasticsearch--> <dependency><groupId&…

基于SpringBoot + vue 的旅游景区网站系统设计与实现

目录 一、需求分析 二、技术分析 三、功能分析 四、数据设计 五、界面展示 六、资源获取 一、需求分析 旅游推荐网站是指提供旅游相关信息、服务和建议的在线平台。这些网站旨在帮助用户规划和安排旅行&#xff0c;提供目的地信息、酒店预订、机票预订、租车服务、旅行建…

antv/g6绘制数据流向图

antv/g6绘制数据流向图 前言接口模拟数据htmlts页面效果 前言 在业务开发中需要绘制数据流向图&#xff0c;由于echarts关系图的限制以及需求的特殊要求&#xff0c;转而使用antv/g6实现&#xff0c;本文以代码的方式实现数据流向需求以及节点分组,版本"antv/g6": “…

从零学习开发一个RISC-V操作系统(四)丨RISC-V汇编语言编程

本篇文章的内容 一、RISC-V汇编语言简介1.1 RISC-V 汇编语言的基本格式1.2 RISC-V 汇编指令操作对象1.3 RISC-V 汇编指令编码格式1.4 RISC-V 汇编指令分类 二、RISC-V汇编语言详解2.1 add 加法指令2.2 sub 减法指令 本系列是博主参考B站课程学习开发一个RISC-V的操作系统的学习…

linux条件判断练习

1.实现自动生成相应的压缩包 1.写一个脚本&#xff0c;完成如下功能 传递一个参数给脚本&#xff0c;此参数为gzip、bzip2或者xz三者之一&#xff1b; (1) 如果参数1的值为gzip&#xff0c;则使用tar和gzip归档压缩/etc目录至/backups目录中&#xff0c;并命名为/backups/etc-…

PPP协议原理介绍+报文分析+配置指导-RFC1661

个人认为&#xff0c;理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息&#xff0c;更加便于理解协议。 因此本文将在PPP协议报文的基础上进行介绍。 关于PPP协议基本原理&#xff0c;可参考RFC1661-The Point-to-Point Protocol (PPP)。 关于P…