Java8从入门到精通 笔记

news2024/11/15 18:32:53

Lambda表达式

匿名内部类

我们可以用匿名内部类来比较两个Integer参数的大小

Comparator<Integer> com = new Comparator<Integer>() {
	@Override
	public int compare(Integer o1, Integer o2) {
	return Integer.compare(o1, o2);
	}
};

TreeSet<Integer> treeSet = new TreeSet<>(com)

上面代码中, 真正有用的代码只有一行,其余都是冗余的

return Integer.compare(o1, o2);

Lambda表达式

用Lambda表达式就可以用更简洁的代码实现这一功能

Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
TreeSet<Integer> treeSet = new TreeSet<>((x, y) -> Integer.compare(x, y));

使用 Lambda 表达式结合 Stream API, 只要给出相应的集合, 我们就可以完成对集合的各种过滤并输出结果信息。

Lambda表达式的语法

Lambda 表达式在 Java 语言中引入了 “->” 操作符, “->” 操作符被称为 Lambda 表达式
的操作符或者箭头操作符, 它将 Lambda 表达式分为两部分:

  • 左侧部分指定了 Lambda 表达式需要的所有参数。
    Lambda 表达式本质上是对接口的实现, Lambda 表达式的参数列表本质上对应着接口中方法的参数列表。
  • 右侧部分指定了 Lambda 体, 即 Lambda 表达式要执行的功能
    Lambda 体本质上就是接口方法具体实现的功能。

函数式接口

只包含一个抽象方法的接口, 称为函数式接口。

可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式抛出一个受检异常, 那么该异常需要在目标接口的抽象方法上进行声明)

可以在任意函数式接口上使用 @FunctionalInterface 注解, 这样做可以检查它是否是一个函数式接口, 同时 javadoc 也会包含一条声明, 说明这个接口是一个函数式接口。

四大核心函数式接口
在这里插入图片描述

Optional容器类

  • Optional.of(T t) : 创建一个 Optional 实例, 要求t不为空
  • Optional.empty() : 创建一个空的 Optional 实例
  • Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
  • isPresent() : 判断是否包含值
  • orElse(T t) : 如果调用对象包含值, 返回该值, 否则返回 t
  • orElseGet(Supplier s) :如果调用对象包含值, 返回该值, 否则返回 s 获取的值
  • map(Function f): 如果有值对其处理, 并返回处理后的 Optional, 否则返回 Optional.empty()
  • flatMap(Function mapper):与 map 类似, 要求返回值必须是 Optional

orElse和orElseGet的区别 :

  String text = "hello";
  System.out.println("============ Using orElseGet: ===============");
  String defaultText = Optional.ofNullable(text).orElseGet(this::getDefaultName);

  System.out.println("============ Using orElse : ===============");
  defaultText = Optional.ofNullable(text).orElse(getDefaultName());

  public String getDefaultName() {
        System.out.println("Getting Default Name");
        return "default string";
  }

执行结果如下:
在这里插入图片描述
当使用 orElseGet()方法时, getDefaultName()方法并不执行, 因为 Optional 中含有值, 而使用 orElse 时则照常执行。

结论: 当值存在时, orElse 相比于 orElseGet多创建了一个对象

方法引用与构造器引用

方法引用

当要传递给 Lambda 体的操作, 已经有实现的方法了, 可以使用方法引用!
这里需要注意的是:实现抽象方法的参数列表, 必须与方法引用方法的参数列表保持一致!

那么什么是方法引用呢? 方法引用就是操作符“::” 将方法名和对象或类的名字分隔开来

当需要引用方法的第一个参数是调用对象, 并且第二个参数是需要引用方法的第二个参
数(或无参数)时: ClassName::methodName 。

构造器引用

ClassName::new
eg.
Function<Integer, MyClass> fun = (n) -> new MyClass(n);
//等同于:
Function<Integer, MyClass> fun = MyClass::new;

//数组引用
type[]::new

Java中的Stream

Stream 是 Java8 中处理集合的关键抽象概念, 它可以指定你希望对集合进行的操作, 可以执行非常复杂的查找、 过滤和映射数据等操作。

流是数据渠道, 用于操作数据源(集合、 数组等) 所生成的元素序列。 “集合讲的是数据, 流讲的是计算! ”
注意:
① Stream 自己不会存储元素。
② Stream 不会改变源对象。 相反, 他们会返回一个持有结果的新 Stream。
③ Stream 操作是延迟执行的。 这意味着他们会等到需要结果的时候才执行。

创建Stream:

  1. 获取stream
  2. 由数组创建stream
  3. 由值创建流 使用静态方法Stream.of()
  4. 由函数创建流 由函数创建流可以创建无限流。
//iterate 通过迭代的方式创建无限流,源码如下
public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f) {
	Objects.requireNonNull(f);
	final Iterator<T> iterator = new Iterator<T>() {
	@SuppressWarnings("unchecked")
	T t = (T) Streams.NONE;
	@Override
	public boolean hasNext() {
		return true;
	} 
	@Override
	public T next() {
		return t = (t == Streams.NONE) ? seed : f.apply(t);
	}
	return StreamSupport.stream(Spliterators.spliteratorUnknownSize(
                iterator,
                Spliterator.ORDERED | Spliterator.IMMUTABLE), false);
};
public static Stream iterate(final T seed, final UnaryOperator f)
iterate这个函数有2个参数,第一个参数是基值,第二个参数是基于第一个参数的运算函数。
eg.如下会生成自然数序列
Stream limit = Stream.iterate(0, n -> n +1).limit(10);
//generate主要通过生成的方式创建无限流
public static<T> Stream<T> generate(Supplier<T> s) {
	Objects.requireNonNull(s);
	return StreamSupport.stream(
		new StreamSpliterators.InfiniteSupplyingSpliterator.OfRef<>(Long.MAX_VALUE, s), false);
}
//generate
public static Stream generate(Supplier s)
generate方法返回一个无限连续的无序流,其中每个元素由提供的Supplier生成。
generate方法用于生成常量流和随机元素流。

Stream的中间操作

多个中间操作可以连接起来形成一个流水线, 除非流水线上触发终止操作, 否则中间操作不会执行任何的处理! 而在终止操作时一次性全部处理, 称为“惰性求值

筛选操作

  • filter——接收 Lambda , 从流中排除某些元素。
  • limit——截断流, 使其元素不超过给定数量。
  • skip(n) —— 跳过元素, 返回一个扔掉了前 n 个元素的流。 若流中元素不足 n 个, 则返回一个空流。 与 limit(n) 互补
  • distinct——筛选, 通过流所生成元素的 hashCode() 和 equals() 去除重复元素

映射

  • map——接收 Lambda , 将元素转换成其他形式或提取信息。 接收一个函数作为参数, 该函数会被应用到每个元素上, 并将其映射成一个新的元素
  • flatMap——接收一个函数作为参数, 将流中的每个值都换成另一个流, 然后把所有流连接成一个流
entityList.stream()
           <!--getTag方法返回的是一个List-->
          .map(Entity::getTag)
          .flatMap(Collection::stream)
  • sorted()——自然排序
  • sorted(Comparator com)——定制排序

Stream的终止操作

查找与匹配

  • allMatch——检查是否匹配所有元素
  • anyMatch——检查是否至少匹配一个元素
  • noneMatch——检查是否没有匹配的元素
  • findFirst——返回第一个元素
  • findAny——返回当前流中的任意元素
  • count——返回流中元素的总个数
  • max——返回流中最大值
  • min——返回流中最小值

规约操作 :

  • reduce(T identity, BinaryOperator) / reduce(BinaryOperator) ——可以将流中元素反复结合起来, 得到一个值。
    根据指定的计算模型将Stream中的值计算得到一个最终结果。Stream的count、min 和max方法底层都是依赖reduce实现的
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
Integer sum = list.stream().reduce(0, (x, y) -> x + y);
System.out.println(sum);
System.out.println("----------------------------------------");
Optional<Double> op = employees.stream().map(Employee::getSalary).reduce(Double::sum);
System.out.println(op.get());

收集

  • collect——将流转换为其他形式。 接收一个 Collector 接口的实现, 用于给 Stream 中元素做汇总的方法,除了常见的toList,toSet静态方法,还有如下一些方法:
    在这里插入图片描述
//去掉重复的任务(根据taskId) 这里用到了collectingAndThen()根据属性进行去重的操作,进行结果集的收集,然后将收集到的结果集进行下一步处理
newList = typePoList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(
                () -> new TreeSet<>(Comparator.comparing(TargetEntity::getTaskId))), ArrayList::new));


public static<T,A,R,RR> Collector<T,A,RR> collectingAndThen(Collector<T,A,R> downstream, Function<R,RR> finisher)

第一个参数是Collector接口的子类,还是对于Collector的处理,Collectors工具类里面的toList()toSet()joining()mapping()collectingAndThen()等几乎所有的方法都可以使用。   
第二个参数是一个Function函数,Function函数是这样的:R apply(T t),这里将第一个参数downstream的结果集,交给第二个参数Function函数处理,例子里也就是将collection转换成List

流进行了终止操作后, 不能再次使用

默认方法

接口中的默认方法

Java 8 中允许接口中包含具有具体实现的方法, 该方法称为“默认方法” , 默认方法使用
default 关键字修饰

默认方法的原则:
在 Java8 中, 默认方法具有**“类优先”** 的原则。
若一个接口中定义了一个默认方法, 而另外一个父类或接口中又定义了一个同名的方法时, 遵循如下的原则。

  • 选择父类中的方法。 如果一个父类提供了具体的实现, 那么接口中具有相同名称
    和参数的默认方法会被忽略。

  • .接口冲突。 如果一个父接口提供一个默认方法, 而另一个接口也提供了一个具有
    相同名称和参数列表的方法(不管方法是否是默认方法) , 那么必须覆盖该方法来解
    决冲突。

public interface MyFunction{
	default String getName(){
		return "function";
	}
}

public interface MyInterface{
	default String getName(){
		return "interface";
	}
}

实现类 MyClass 同时实现了 MyFunction 接口和 MyInterface 接口, 由于 MyFunction 接口和MyInterface 接口中都存在 getName()默认方法, 所以, MyClass 必须覆盖getName()方法来解决冲突

public class MyClass implements MyInterface,MyFunction{
	@Override
	public String getName(){
		return MyInterface.super.getName();
	}
}

接口中的静态方法

在 Java8 中, 接口中允许添加静态方法, 使用方式 接口名.方法名

public interface MyFunction{
	default String getName(){
		return "binghe";
	}
	static void send(){
		System.out.println("Send Message...");
	}
}

MyFunction.send();

本地时间和时间戳

  • now: 静态方法, 根据当前时间创建对象
  • of: 静态方法, 根据指定日期/时间创建对象
  • plusDays,plusWeeks,plusMonths,plusYears: 向当前 LocalDate 对象添加几天、 几周、 几个月、 几年
  • minusDays,minusWeeks,minusMonths,minusYears: 从当前 LocalDate 对象减去几天、 几周、 几个月、 几年
  • plus,minus: 添加或减少一个 Duration 或 Period
  • withDayOfMonth,withDayOfYear,withMonth,withYear: 将月份天数、 年份天数、 月份、 年份修改为指定的值并返回新的 LocalDate 对象
  • getDayOfYear: 获得年份天数(1~366)
  • getDayOfWeek: 获得星期几(返回一个 DayOfWeek 枚举值)
  • getMonth: 获得月份, 返回一个 Month 枚举值
  • getMonthValue: 获得月份(1~12)
  • getYear: 获得年份
  • until: 获得两个日期之间的 Period 对象, 或者指定 ChronoUnits 的数字
  • isBefore,isAfter: 比较两个 LocalDate
  • isLeapYear: 判断是否是闰年

LocalDate、 LocalTime、 LocalDateTime 类的实例是不可变的对象.它们提供了简单的日期或时间, 并不包含当前的时间信息,也不包含和时区相关的信息

   // 获取当前系统时间
   LocalDateTime localDateTime1 = LocalDateTime.now();
   System.out.println(localDateTime1);// 2022-12-03T22:10:12.179
   // 指定日期时间
   LocalDateTime localDateTime2 = LocalDateTime.of(2022, 10, 27, 22, 10,10);
   System.out.println(localDateTime2);// 2022-10-27T22:10:10
   LocalDateTime localDateTime3 = localDateTime1
           .plusYears(3)
           .minusMonths(3);
   System.out.println(localDateTime3);//2025-09-03T22:10:53.235
   System.out.println(localDateTime1.getYear()); // 运行结果: 2022
   System.out.println(localDateTime1.getMonthValue()); // 运行结果: 12
   System.out.println(localDateTime1.getDayOfMonth()); // 运行结果: 3
   System.out.println(localDateTime1.getHour()); // 运行结果: 22
   System.out.println(localDateTime1.getMinute()); // 运行结果: 10
   System.out.println(localDateTime1.getSecond()); // 运行结果: 53
   LocalDateTime localDateTime4 = LocalDateTime.now();
   System.out.println(localDateTime4); // 22022-12-03T22:10:53.236
   LocalDateTime localDateTime5 = localDateTime4.withDayOfMonth(10);
   System.out.println(localDateTime5); // 2022-12-10T22:10:53.236

Instant时间戳

    Instant instant1 = Instant.now(); //默认获取UTC时区的时间
    System.out.println(instant1);//2022-12-03T14:14:36.305Z
    // 偏移量运算
    OffsetDateTime offsetDateTime = instant1.atOffset(ZoneOffset.ofHours(8));
    System.out.println(offsetDateTime);//2022-12-03T22:14:36.305+08:00
    // 获取时间戳
    System.out.println(instant1.toEpochMilli());//1670076876305
    //以Unix元年为起点,进行偏移量运算
    Instant instant2 = Instant.ofEpochSecond(60);
    System.out.println(instant2);//1970-01-01T00:01:00Z

Duration和Period

Duration:用于计算两个“时间” 间隔。
Period:用于计算两个“日期” 间隔

  LocalTime time1 = LocalTime.now();
  try {
     Thread.sleep(1000);
  } catch (InterruptedException e) {
      e.printStackTrace();
  }
  LocalTime time2 = time1.plusSeconds(1);
  Duration duration = Duration.between(time1, time2);
  System.out.println(duration.toMillis());// 运行结果: 1000
  LocalDate localDate_1 = LocalDate.of(2018,9, 9);
  LocalDate localDate_2 = LocalDate.now();
  Period period = Period.between(localDate_1, localDate_2);
  System.out.println(period.getYears()); // 运行结果: 4
  System.out.println(period.getMonths()); // 运行结果: 2
  System.out.println(period.getDays()); // 运行结果: 24

日期的操作

时间校正其TemporalAdjuster eg.将时间调整到下周日

 LocalDate nextSunday = LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.SUNDAY))

 //自定义 下一个工作日
 LocalDateTime localDateTime2 = localDateTime1.with(l -> {
    LocalDateTime localDateTime = (LocalDateTime) l;
     DayOfWeek dayOfWeek = localDateTime.getDayOfWeek();
     if (dayOfWeek.equals(DayOfWeek.FRIDAY)) {
         return localDateTime.plusDays(3);
     } else if (dayOfWeek.equals(DayOfWeek.SATURDAY)) {
         return localDateTime.plusDays(2);
     } else {
         return localDateTime.plusDays(1);
     }
 });

解析与格式化

java.time.format.DateTimeFormatter 类: 该类提供了三种格式化方法:

  • 预定义的标准格式
  • 语言环境相关的格式
  • 自定义的格式
   DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ISO_DATE;
   LocalDateTime localDateTime = LocalDateTime.now();
   String strDate1 = localDateTime.format(dateTimeFormatter1);
   System.out.println(strDate1);//2022-12-03
   // Date -> String
   DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
   String strDate2 = dateTimeFormatter2.format(localDateTime);
   System.out.println(strDate2);//2022-12-03 22:38:44
   // String -> Date
   LocalDateTime localDateTime2 = localDateTime.plusDays(2);
   System.out.println(localDateTime2);//2022-12-05T22:38:44.483
   LocalDateTime localDateTime1 = localDateTime2.parse(strDate2, dateTimeFormatter2);
   System.out.println(localDateTime1);//2022-12-03T22:38:44

注意下: localDateTime2.parse(strDate2, dateTimeFormatter2); 这里实际转换的时间是strDate2的时间

时区的处理

Java8 中加入了对时区的支持, 带时区的时间为分别为: ZonedDate、 ZonedTime、 ZonedDateTime。

每个时区都对应着 ID, 地区 ID 都为 “{区域}/{城市}” 的格式, 例如 : Asia/Shanghai
等。

  • ZoneId: 该类中包含了所有的时区信息
  • getAvailableZoneIds() : 可以获取所有时区时区信息
  • of(id) : 用指定的时区信息获取 ZoneId 对象
 //获取所有时区信息
 ZoneId.getAvailableZoneIds();
 // 通过时区构建LocalDateTime
 LocalDateTime localDateTime1 = LocalDateTime.now(ZoneId.of("America/El_Salvador"));
 System.out.println(localDateTime1);//2022-12-03T08:43:33.981
 // 以时区格式显示时间
 LocalDateTime localDateTime2 = LocalDateTime.now();
 ZonedDateTime zonedDateTime1 = localDateTime2.atZone(ZoneId.of("Asia/Shanghai"));
 System.out.println(zonedDateTime1);// 2022-12-03T22:43:33.986+08:00[Asia/Shanghai]

与传统日期处理的转换

在这里插入图片描述

Java 8 对注解的增强

Java 8 对注解处理提供了两点改进: 可重复的注解及可用于类型的注解。
@Repeatable(BingheAnnotations.class)注解

@Repeatable(BingheAnnotations.class)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMET
ER, ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE,ElementType.TYPE_PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface BingheAnnotation {
	String value();
}

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMET
ER, ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE,ElementType.TYPE_PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface BingheAnnotations {
	BingheAnnotation[] value();
}

在 BingheAnnotations 注解类中, 定义了一个 BingheAnnotation 注解类的数组, 也就是说, 在 BingheAnnotations 注解类中, 包含有多个 BingheAnnotation 注解。
故在 BingheAnnotation 注解类上指定@Repeatable(BingheAnnotations.class)来说明可以在类、 字段、 方法、 参数、 构造方法上重复使用 BingheAnnotation 注解。

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

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

相关文章

接口幂-全面详解(学习总结---从入门到深化)

目录 接口设计与重试机制引发的问题 什么是幂等性 为什么会产生接口幂等性问题 幂等性接口设计 如何保证接口幂等性 接口设计与重试机制引发的问题演示_项目搭建 创建项目 选择框架 修改SpringBoot版本 创建用户表 代码生成 引入依赖 编写代码生成类 接口设计与重试机制引…

Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs笔记

论文地址&#xff1a;https://arxiv.org/pdf/2203.06717.pdf 代码地址&#xff1a;https://github.com/MegEngine/RepLKNet 目录 论文地址&#xff1a;https://arxiv.org/pdf/2203.06717.pdf 代码地址&#xff1a;https://github.com/MegEngine/RepLKNet Abstract 1. Introd…

MySQL架构MMM

官网地址&#xff1a; Multi-Master Replication Manager for MySQL [MMM for MySQL Wiki] 简介 MMM&#xff08;Master-Master replication manager for MySQL&#xff09;是一套支持双主故障切换和双主日常管理的脚本程序。MMM使用Perl语言开发&#xff0c;主要用来监控和…

Kafka - 14 Kafka分区的分配策略及再平衡 | Range | RoundRobin | Sticky | CooperativeSticky

文章目录1. 分区的分配以及再平衡2. Range 分区分配以及再平衡3. RoundRobin 分区分配以及再平衡4. Sticky 分区分配以及再平衡1. 分区的分配以及再平衡 一个consumer group中有多个consumer组成&#xff0c;一个 topic有多个partition组成&#xff0c;现在的问题是&#xff0…

[Windows驱动开发] BlackBone介绍

▒ 目录 ▒&#x1f6eb; 导读需求开发环境1️⃣ 名词解释2️⃣ 介绍3️⃣ 库包含内容4️⃣ 编译问题总结常见问题fatal error LNK1104非类型模板参数中的 "auto" &#x1f4d6; 参考资料&#x1f6eb; 导读 需求 作为Windows开发人员&#xff0c;经常遇到枚举进程、…

dojo中的类

使用arcgis api for js 4.*进行地图的web前端开发&#xff0c;就不得不与dojo打交道。dojo是一个框架&#xff0c;自成体系&#xff0c;比如它对类的支持&#xff0c;有自己的一套。众所周知&#xff0c;js不是面向对象语言&#xff0c;没有类这一说&#xff0c;都是用函数来模…

人工智能轨道交通行业周刊-第25期(2022.11.28-12.4)

本期关键词&#xff1a;液体安检仪、智慧车站、大机作业、动车打温、实时人体姿态估计、图像压缩 1 整理涉及公众号名单 1.1 行业类 RT轨道交通中关村轨道交通产业服务平台人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟V…

Java项目:SSM医院挂号预约管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为管理员与医生两种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,添加科室,科室增删改查,医生管理,查看预约信息,…

Redis03:Redis基础知识以及数据类型

Redis基础知识以及数据类型基础知识Redis-key基本数据类型String(字符串)三种特殊的数据类型geospatialhyperloglogbitmaps基础知识 redis默认有16个数据库&#xff0c;默认使用的时第0个&#xff0c;可以使用select进行切换数据库 清除当前数据库 清除全部数据库的内容 Red…

Cmake升级与软链接

记录cmake升级版本的记录&#xff0c;主要参考文章&#xff1a;Unbuntu安装Ros后Cmake变成3.10_向日葵骑士Faraday的博客-CSDN博客 cmake升级、更新&#xff08;ubuntu18.04&#xff09;_Doctor_Wu_的博客-CSDN博客_cmake升级 设计安装ros后cmake版本出现问题&#xff0c;且卸…

[附源码]Python计算机毕业设计Django基于Java的员工管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Windows 文件共享功能使用方法,局域网多台电脑之间传送文件

设想一下&#xff0c;家里或者公司有多台电脑&#xff0c;连接同一个Wifi&#xff0c;也就是处于同一个局域网中。 在不能使用微信、网盘的文件传输功能的情况下&#xff0c;这多台电脑之间&#xff0c;就只能用U盘传送数据吗&#xff1f; 不。Windows系统中已经提供了文件共享…

ZMQ之克隆模式的可靠性

克隆服务器的可靠性 克隆模型1至5相对比较简单&#xff0c;下面我们会探讨一个非常复杂的模型。可以发现&#xff0c;为了构建可靠的消息队列&#xff0c;我们需要花费非常多的精力。所以我们经常会问&#xff1a;有必要这么做吗&#xff1f;如果说你能够接受可靠性不够高的、或…

Docker三大核心概念(镜像、容器和仓库)与虚拟化

目录 1. Docker是什么 2. Docker与虚拟化 3. Docker虚拟化的好处 4. Docker核心概念 4.1.镜像 4.2.容器 4.3.仓库 5. CentOS7 安装docker(在线方式) 5.1.内核版本信息检查 5.2 卸载可能存在的旧版本 5.3 安装必要的系统工具 5.4 添加docker-ce安装源 5.5 更新yum缓存 5.…

web前端期末大作业:个人网站设计——响应式个人小站网站HTML+CSS+JavaScript

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

STC 51单片机54——气压水压计HX710B 串口显示均值滤波+滑窗滤波

//气压模块为红色模块&#xff0c;传感器型号未知&#xff0c;其信号放大器型号为HX710B // STC15W408AS 11.0592MHz 波特率9600&#xff0c;串口输出大气压强值 // STC15W408AS没有定时器1&#xff0c;所以用定时器2做波特率发生器 // 采用电脑USB供电会有很大的干扰&#xff…

Unity工具 - 工具聚合页(UEWindow)

随着项目工程的推进&#xff0c;开发者们会根据工作内容的需要在Unity内开发众多的工具。随着工具的增多&#xff0c;Unity 的Menu菜单也会逐渐臃肿&#xff0c;过于分散&#xff0c;工具代码也难以查找。在此问题的基础上&#xff0c;开发了工具聚合页(UEWindow) 这一功能来管…

R绘图案例|基于分面的面积图

简介 最近参加一个统计建模的比赛。模型建模后&#xff0c;需要展示不同模型的性能指标&#xff0c;数据如下所示&#xff1a; 其中&#xff0c;第 1 列是不同样本&#xff0c;共376条。第 2-4 列是随机森林得到的结果&#xff0c;第 5-7 列是XGBoost的结果。一共使用了三种评…

数字验证学习笔记——UVM学习3 核心基类

一、核心基类 UVM世界中的类最初都是从一个uvm_void根类&#xff08;root class&#xff09;继承来的&#xff0c;而实际上这个类并没有成员变量和方法。 uvm_void只是一个虚类&#xff08;virtual class&#xff09;&#xff0c;还在等待将来继承于它的子类去开垦。在继承与u…

适合新手的Pytorch的中文文档

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…