一分钟掌握java9新特性
try-with-resources语句
/** * 在处理必须关闭的资源时,使用try-with-resources语句替代try-finally语句。 生成的代码更简洁,更清晰,并且生成的异常更有用 * java9 之前写法 */
public static String readFile1(String fileName){ try (Reader inputString = new StringReader(fileName); BufferedReader br = new BufferedReader(inputString)) { return br.readLine(); } catch (IOException e) { throw new RuntimeException(e); }
} /** * 在处理必须关闭的资源时,使用try-with-resources语句替代try-finally语句。 生成的代码更简洁,更清晰,并且生成的异常更有用 * java9之后写法 */
public static String readFile2(String fileName){ Reader inputString = new StringReader(fileName); BufferedReader br = new BufferedReader(inputString); try (br) { return br.readLine(); } catch (IOException e) { throw new RuntimeException(e); }
}
改进的集合工厂方法
Java 9 提供了一些新的静态工厂方法 List.of(), Set.of(), 和 Map.of() 来创建不可变集合。
示例代码:
public static void main(String[] args) { List<Integer> list = List.of(1, 2, 3); Set<Integer> set = Set.of(1, 2, 3); Map<String, Integer> map = Map.of("one", 1, "two", 2, "three", 3); System.out.println(list); System.out.println(set); System.out.println(map);
}
控制台输出:
[1, 2, 3]
[1, 2, 3]
{two=2, three=3, one=1}
增强流(Stream)API
takeWhile 方法
takeWhile 方法允许你在满足给定的谓词条件下获取流中的元素,直到第一个不满足条件的元素出现为止。
示例代码:
public static void main(String[] args) { List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); List<Integer> takeWhileList = numbers.stream() .takeWhile(n -> n < 5) .collect(Collectors.toList()); System.out.println("Take while: " + takeWhileList);
}
控制台输出:
Take while: [1, 2, 3, 4]
dropWhile 方法
dropWhile 方法则相反,它会跳过流中的元素,直到找到第一个满足给定谓词的元素,然后返回剩余的所有元素。
示例代码:
public static void main(String[] args) { List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); List<Integer> dropWhileList = numbers.stream() .dropWhile(n -> n < 5) .collect(Collectors.toList()); System.out.println("Drop while: " + dropWhileList);
}
控制台输出:
Drop while: [5, 6, 7, 8, 9, 10]
ofNullable 方法
ofNullable 方法允许你从一个可能为 null 的值创建一个 Stream,如果值不是 null,则创建一个单元素流;如果是 null,则创建一个空流。
示例代码:
public static void main(String[] args) { Optional<String> optionalString = Optional.of("Hello World"); Stream<String> stream = Stream.ofNullable(optionalString.orElse(null)); stream.forEach(System.out::println);
}
控制台输出:
Hello World
iterate 方法
iterate 方法允许你基于一个初始值和一个迭代函数来创建无限流,Java 9 为 iterate 方法增加了一个重载版本,允许你指定一个终止条件。
示例代码:
public static void main(String[] args) { // 使用 iterate 创建一个无限流,直到达到 10 Stream<Long> infiniteStream = Stream.iterate(0L, n -> n + 1); // 限制流的大小 Stream<Long> limitedStream = infiniteStream.limit(10); limitedStream.forEach(System.out::println); // 使用 iterate 的重载版本,直到终止条件为 true Stream<Long> untilStream = Stream.iterate(0L, n -> n < 10, n -> n + 1); untilStream.forEach(System.out::println);
}
控制台输出:
限制流的大小: 0 1 2 3 4 5 6 7 8 9
终止条件为 true: 0 1 2 3 4 5 6 7 8 9
Optional 类的新方法
Java 9 为 Optional 类添加了一些新方法,如 ifPresentOrElse 和 or 。
ifPresentOrElse
ifPresentOrElse 方法的作用是:如果Optional 中有值,则执行指定的操作;
如果没有值,则执行另一个操作。这个方法可以让我们在处理可选值时,避免使用多个if 语句,从而使代码更加简洁。
源码:
void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
action:如果Optional中有值,则执行的操作。emptyAction:如果Optional中没有值,则执行的操作。
示例代码:
import java.util.Optional;public class IfPresentOrElseExample {public static void main(String[] args) {// 有值的情况Optional<String> optionalValue = Optional.of("Hello, World!");optionalValue.ifPresentOrElse(value -> System.out.println("Value is present: " + value),() -> System.out.println("Value is absent"));// 没有值的情况Optional<String> emptyValue = Optional.empty();emptyValue.ifPresentOrElse(value -> System.out.println("Value is present: " + value),() -> System.out.println("Value is absent"));}
}
控制台:
Value is present: Hello, World!
Value is absent
or
or 方法的作用是:如果 Optional 中有值,则返回该值;如果没有值,则返回另一个 Optional 。这个方法使得我们可以提供一个备用的值或 Optional ,从而避免 null 的情况。
源码:
Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)
supplier:如果Optional为空,则提供一个新的Optional。
示例代码:
import java.util.Optional;public class OrExample {public static void main(String[] args) {// 有值的情况Optional<String> optionalValue = Optional.of("Hello");String result1 = optionalValue.or(() -> Optional.of("Default Value")).get();System.out.println("Result 1: " + result1); // 输出: Hello// 没有值的情况Optional<String> emptyValue = Optional.empty();String result2 = emptyValue.or(() -> Optional.of("Default Value")).get();System.out.println("Result 2: " + result2); // 输出: Default Value}
}
控制台:
Result 1: Hello
Result 2: Default Value
总结
ifPresentOrElse方法允许我们在处理Optional时,优雅地处理有值和无值的情况。or方法则提供了一种方式来指定备用的Optional值,以便在原始Optional为空时使用。
这两个方法的引入,使得Optional的使用更加灵活和方便,帮助开发者更好地处理可能缺失的值。
反应式流(Reactive Streams)
Java 9 引入了对反应式编程的支持,提供了 Flow 类,用于处理异步数据流。 Flow 类是 Java 反应式流(Reactive Streams)规范的一部分,允许开发者以非阻塞的方式处理数据流,并支持背压(backpressure)机制。
Flow 类的核心组件
- Publisher:发布数据流的对象。
- Subscriber:订阅数据流的对象,负责处理接收到的数据。
- Subscription:连接发布者和订阅者的桥梁,负责请求数据和控制数据流。
- Processor:既是发布者又是订阅者,负责在数据流中进行处理。
示例代码
import java.util.concurrent.Flow;
import java.util.concurrent.SubmissionPublisher;/** * 展示了如何使用 Flow 类创建一个发布者和一个订阅者。 */
public class ReactiveStreamsExample {public static void main(String[] args) {// 创建一个 SubmissionPublisher,作为发布者SubmissionPublisher<String> publisher = new SubmissionPublisher<>();// 创建一个订阅者Flow.Subscriber<String> subscriber = new Flow.Subscriber<>() {private Flow.Subscription subscription;@Overridepublic void onSubscribe(Flow.Subscription subscription) {this.subscription = subscription;// 请求1个数据subscription.request(1);}@Overridepublic void onNext(String item) {System.out.println("Received: " + item);// 处理完一个数据后,再请求下一个数据subscription.request(1);}@Overridepublic void onError(Throwable throwable) {System.err.println("Error: " + throwable.getMessage());}@Overridepublic void onComplete() {System.out.println("Processing complete.");}};// 将订阅者注册到发布者publisher.subscribe(subscriber);// 发布一些数据System.out.println("Publishing items...");for (int i = 1; i <= 5; i++) {publisher.submit("Item " + i);}// 关闭发布者publisher.close();}
}
代码解释
- SubmissionPublisher:这是一个实现了
Publisher接口的类,允许我们手动提交数据。 - Subscriber:我们实现了
Flow.Subscriber接口,定义了如何处理接收到的数据。onSubscribe:当订阅者与发布者连接时调用,负责请求数据。onNext:当接收到数据时调用,处理数据并请求下一个数据。onError:处理错误情况。onComplete:处理完成时的逻辑。
- 数据发布:我们在一个循环中发布了5个数据项,并在发布后关闭了发布者。
使用场景
- 实时数据处理:
- 在金融服务中,实时处理股票价格、交易数据等信息,反应式流可以帮助系统快速响应市场变化。
- 微服务架构:
- 在微服务架构中,各个服务之间通过消息队列进行通信。使用反应式流可以有效地处理来自不同服务的异步消息,提高系统的响应能力和可扩展性。
- Web 应用程序:
- 在高并发的 Web 应用中,反应式流可以用来处理用户请求,特别是当请求涉及到数据库查询或外部 API 调用时,可以避免阻塞主线程,提高用户体验。
- 数据流处理:
- 在数据分析和 ETL(提取、转换、加载)过程中,反应式流可以用于处理大量数据的流式传输和实时分析。
- 物联网(IoT)应用:
- 在物联网应用中,设备会不断生成数据,反应式流可以帮助处理这些数据流,进行实时监控和分析。
- 其他:
- 结合当前的特性再应用到合适的场景中
总结
Java 9 的 Flow 类为开发者提供了一种强大的工具来处理异步数据流,支持非阻塞操作和背压机制。这使得反应式编程在现代应用中变得越来越重要,特别是在需要高并发、高可用性和实时处理的场景中。
JShell(交互式命令行工具)
JShell 是一个新的命令行工具,可以用来快速测试 Java 代码片段,而无需创建完整的 Java 程序。
//第一步 输入 jshell 进入
PS D:\project\hot-sauce-2> jshell
| 欢迎使用 JShell -- 版本 17.0.7
| 要大致了解该版本, 请键入: /help intro //第二步 编写代码
jshell> int sum(int a, int b) {
...> return a + b;
...> }
| 已创建 方法 sum(int,int) // 第三部 运行第二步代码,得到结果
jshell> sum(5, 10)
$2 ==> 15
接口中的私有方法
Java 9 允许在接口中声明私有方法,这可以用来实现共享逻辑。
示例代码:
/** * 接口 */
public interface MyInterface { // 私有方法 private void printMessage() { System.out.println("This is a private method in an interface."); } // 默认方法 default void display() { printMessage(); }
}/** * 实现*/
public class MyClass implements MyInterface { public static void main(String[] args) { new MyClass().display(); }
}
增强@Deprecated注解
在 Java 9 中, @Deprecated 注解得到了增强,提供了更多的信息以帮助开发者理解被弃用的 API 的状态。这一增强主要体现在两个新的元素的引入上:
1. forRemoval
- 类型:
boolean - 说明:该元素指示被弃用的元素是否计划在未来的版本中移除。如果设置为
true,表示这个元素在未来的某个版本中会被移除。这个信息对于开发者来说非常重要,因为它可以帮助他们决定是否应该立即迁移到替代方案。
2. since
- 类型:
String - 说明:该元素用于指定自哪个版本开始该元素被弃用。这可以让开发者快速了解该 API 的弃用历史,从而更好地管理代码的兼容性。
代码示例
public class Example {/*** @deprecated This method is deprecated because it is inefficient.* It is recommended to use {@link #newMethod()} instead.* * @since 9* @forRemoval true*/@Deprecated(since = "9", forRemoval = true)public void oldMethod() {// old implementation}public void newMethod() {// new implementation}
}
在上面的示例中:
oldMethod被标记为弃用,注解中包含了since = "9",表示这个方法从 Java 9 开始被弃用。forRemoval = true表示这个方法计划在未来的版本中被移除。- 方法的文档注释中也建议使用
newMethod()作为替代方案。
总结
Java 9 中对 @Deprecated 注解的增强使得开发者在使用被弃用的 API 时能够获得更多的上下文信息。这种增强有助于提高代码的可维护性,减少未来版本中的兼容性问题,促使开发者更早地迁移到更好的替代方案。通过明确标记弃用的原因和计划移除的时间,Java 9 使得 API 的管理变得更加清晰和高效。
CompletableFuture API
在 Java 9 中, CompletableFuture API 进行了多项增强,使得异步编程更加灵活和强大
1. 新的工厂方法
Java 9 引入了几个新的静态工厂方法,增强了 CompletableFuture 的创建和组合能力:
CompletableFuture.allOf(CompletableFuture<?>... futures):- 这个方法接受多个
CompletableFuture对象,并在所有给定的CompletableFuture完成时完成。适用于需要等待多个异步任务完成的场景。
- 这个方法接受多个
CompletableFuture.anyOf(CompletableFuture<?>... futures):- 这个方法接受多个
CompletableFuture对象,并在其中任意一个完成时完成。适合用于需要在多个任务中选择第一个完成的任务的场景。
示例代码
- 这个方法接受多个
import java.util.concurrent.CompletableFuture;public class CompletableFutureExample {public static void main(String[] args) {CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {// 模拟耗时操作sleep(1000);return "Result from Future 1";});CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {sleep(2000);return "Result from Future 2";});// 使用 allOf 等待所有任务完成CompletableFuture<Void> allOf = CompletableFuture.allOf(future1, future2);allOf.join(); // 阻塞直到所有任务完成// 输出结果System.out.println(future1.join());System.out.println(future2.join());// 使用 anyOf 等待任意一个任务完成CompletableFuture<Object> anyOf = CompletableFuture.anyOf(future1, future2);System.out.println("First completed: " + anyOf.join());}private static void sleep(int millis) {try {Thread.sleep(millis);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}
}
2. 异常处理增强
Java 9 对异常处理的支持进行了增强,特别是与异常处理和组合相关的方法:
handle(BiFunction<? super T, Throwable, ? extends U> fn):- 这个方法允许你在计算完成时处理结果或异常。无论是正常完成还是异常完成,都会调用提供的函数。
exceptionally(Function<? super Throwable, ? extends T> fn):- 用于处理异常的函数,如果
CompletableFuture在计算过程中发生异常,则会调用这个函数。
示例代码
- 用于处理异常的函数,如果
import java.util.concurrent.CompletableFuture;public class CompletableFutureErrorHandlingExample {public static void main(String[] args) {CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {// 模拟异常if (true) throw new RuntimeException("Something went wrong!");return "Result";});future.handle((result, ex) -> {if (ex != null) {System.out.println("发生错误: " + ex.getMessage());return "备用结果";}return result;}).thenAccept(System.out::println);}
}
3. delayedExecutor 方法
Java 9 引入了 delayedExecutor 方法,允许你创建一个带有延迟的执行器,用于在指定的延迟后执行任务。
delayedExecutor(long delay, TimeUnit unit):- 返回一个
ExecutorService,可以用来在指定的延迟后执行任务。
示例代码
- 返回一个
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;public class DelayedExecutorExample {public static void main(String[] args) {// 创建一个带有延迟的执行器ExecutorService executor = CompletableFuture.delayedExecutor(2, TimeUnit.SECONDS);CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {System.out.println("任务在延迟后执行");}, executor);// 等待任务完成future.join();System.out.println("主线程结束");}
}
4. 超时处理增强
Java 9 还增加了对超时处理的支持:
orTimeout(long timeout, TimeUnit unit):- 允许设置超时,如果在指定的时间内未完成,则会自动取消
CompletableFuture。
- 允许设置超时,如果在指定的时间内未完成,则会自动取消
completeOnTimeout(T value, long timeout, TimeUnit unit):- 允许在指定的超时时间内完成
CompletableFuture,如果在超时之前没有完成,则会使用给定的值完成。
- 允许在指定的超时时间内完成
总结
Java 9 对 CompletableFuture 的增强使得异步编程更加灵活和强大,提供了更好的异常处理机制、组合方式和超时处理能力。通过新增的工厂方法和增强的方法,开发者可以更方便地处理并发任务,提高程序的响应性和可维护性。这些特性使得 CompletableFuture 成为处理异步编程的重要工具。
ProcessHandle 类增强
在 Java 9 中, ProcessHandle 类得到了增强,提供了一些新的特性和方法,使得对操作系统进程的管理和监控变得更加方便和高效。以下是 Java 9 中 ProcessHandle 的主要新特性:
1. 新增的静态方法
Java 9 引入了一些新的静态方法,使得获取当前进程的信息变得更加简单:
ProcessHandle.current():- 该方法返回当前 Java 进程的
ProcessHandle实例。通过这个实例,开发者可以获取当前进程的 ID、状态等信息。
- 该方法返回当前 Java 进程的
2. 进程信息获取
通过 ProcessHandle ,可以获取关于进程的多种信息:
pid():- 返回进程的唯一标识符(PID)。
info():- 返回一个
ProcessHandle.Info对象,提供关于进程的详细信息,包括命令行、启动时间、用户等。
- 返回一个
children():- 返回当前进程的子进程的
ProcessHandle流。可以用于遍历当前进程的所有子进程。
- 返回当前进程的子进程的
parent():- 返回当前进程的父进程的
ProcessHandle(如果存在)。
- 返回当前进程的父进程的
3. 进程状态监控
Java 9 中的 ProcessHandle 提供了对进程状态的监控功能:
isAlive():- 检查进程是否仍在运行。
4. 进程终止
可以通过 ProcessHandle 来终止进程:
destroy():- 终止与该
ProcessHandle关联的进程。
- 终止与该
示例代码
import java.util.Optional;public class ProcessHandleExample {public static void main(String[] args) {// 获取当前进程的 ProcessHandleProcessHandle currentProcess = ProcessHandle.current();// 打印当前进程的 PIDSystem.out.println("Current Process ID: " + currentProcess.pid());// 获取进程信息ProcessHandle.Info info = currentProcess.info();System.out.println("Command: " + info.command().orElse("N/A"));System.out.println("Arguments: " + info.arguments().map(argsArray -> String.join(", ", argsArray)).orElse("N/A"));System.out.println("User: " + info.user().orElse("N/A"));System.out.println("Start Time: " + info.startInstant().orElse(null));// 检查进程是否存活System.out.println("Is Alive: " + currentProcess.isAlive());// 获取子进程currentProcess.children().forEach(child -> {System.out.println("Child Process ID: " + child.pid());});// 获取父进程Optional<ProcessHandle> parentProcess = currentProcess.parent();parentProcess.ifPresent(parent -> {System.out.println("Parent Process ID: " + parent.pid());});}
}
总结
Java 9 中对 ProcessHandle 的增强使得开发者能够更加方便地管理和监控操作系统进程。通过新增的方法,开发者可以轻松获取进程的基本信息、监控进程状态、获取子进程和父进程的信息,以及终止进程。这些特性为 Java 应用程序提供了更强大的进程管理能力,特别是在需要与底层操作系统进行交互的场景中。
其他
多分辨率图像API、内部类操作符、改进了JavaDocs、多版本共存JAR 等想要了解的同学可以进一步研究,在实际项目中使用极少,这么就不展开说明了
相关文章:
一分钟掌握java9新特性
try-with-resources语句 /** * 在处理必须关闭的资源时,使用try-with-resources语句替代try-finally语句。 生成的代码更简洁,更清晰,并且生成的异常更有用 * java9 之前写法 */ public static String readFile1(String fileName){ tr…...
89. UE5 RPG 实现伤害 冷却 消耗技能描述
在上一篇文章里,我们能够通过富文本显示多种格式的文字,并显示技能描述。在这一篇文章里,我们继续优化技能描述,将技能说需要显示的内容显示出来。 实现火球术的基础描述 首先,我们现实现火球术的基础描述࿰…...
el-tree树状控件,定位到选中的节点的位置
效果图 在el-tree 控件加 :render-content"renderContent" 在掉接口的方法中 实际有用的是setTimeout 方法和this.$refs.xxxxxx.setCheckedKeys([industrycodeList]) if(res.data.swindustrylist.length>0){res.data.swindustrylist.forEach(item > {industry…...
YOLO目标检测的单目(多目标测距),使用相机光学模型,支持目标检测模型训练,可输出目标位置和距离信息并可视化
本项目旨在开发一个基于YOLO的目标检测系统,该系统不仅能检测图像中的多个目标,还能利用单目摄像头的图像估计每个目标与摄像头之间的相对距离。系统的核心组成部分包括目标检测、距离估计、模型训练以及结果可视化。 主要功能 目标检测:使用…...
unity简易lua文件迁移工具
一. 了解商业游戏的Lua热更新开发方式 市面上的3种结合Lua热更新的开发方式 1.纯Lua开发(所有的游戏主要逻辑都用Lua实现) 好处:机动性强;坏处:代码效率略差 2.半C#,半Lua开发(核心逻辑C#开发…...
Elasticsearch中的自动补全功能详解与实践
简介 自动补全是现代搜索引擎中的一项重要功能,它能够根据用户的输入提供实时的建议,提高用户体验。Elasticsearch提供了Completion Suggester查询来实现这一功能。本文将详细介绍Elasticsearch中的自动补全功能,并提供详细的配置和查询示例…...
前端如何使用Nginx代理dist网页,代理websocket,代理后端
本文将指导您如何配置Nginx以代理前后端分离的项目,并特别说明了对WebSocket的代理设置。通过本教程,您将能够实现一次性配置,进而使项目能够在任意局域网服务器上部署,并可通过IP地址或域名访问服务。 笔者建议 先速览本文了解大…...
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. 问题解决
问题描述 原来我的服务器docker服务运行正常,但在某次尝试用时, 根据系统的错误提示执行了snap install docker指令之后, 再执行docker ps命令则提示Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running…...
零基础学习Redis(2) -- Redis安装与配置
Redis官方是并不支持Windows系统的,并且现在绝大部分公司都是使用的Linux,所以我们在Linux上进行安装,这里我使用的是Ubuntu 1. 安装步骤 1. 首先使用工具连接到我们的云服务器,然后输入apt指令搜索redis相关的软件包࿱…...
UniApp第一天
一、官网介绍 1.1、 SDK SDK是"Software Development Kit"的缩写,中文意思是“软件开发工具包”。SDK通常是由软件开发者为其他开发者提供的一个软件工具集合,用于帮助开发者快速开发、测试和部署软件应用。SDK通常包含了一系列的开发工具、库…...
TLE4966-3G带方向检测功能的高灵敏度汽车霍尔开关
TLE4966-3G是一款集成电路双霍尔效应传感器,专为使用旋转极轮的高精度应用而设计。通过片上有源补偿电路和斩波器技术实现精确的磁切换点和高温稳定性。 该传感器在Q2提供速度输出,其状态(高或低)与磁场值相对应。对于超过阈值BO…...
Github 2024-08-14 C开源项目日报Top10
根据Github Trendings的统计,今日(2024-08-14统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10Objective-C项目1PHP项目1Python项目1PHP:流行的Web开发脚本语言 创建周期:4710 天开发语言:C, PHP协议类型:OtherStar数量:37340 …...
飞桨Paddle API index_add 详解
index_add paddle.index_add(x, index, axis, value, nameNone)[源代码] 沿着指定轴 axis 将 index 中指定位置的 x 与 value 相加,并写入到结果 Tensor 中的对应位置。这里 index 是一个 1-D Tensor。除 axis 轴外,返回的 Tensor 其余维度大小和输入 …...
后端代码练习1——加法计算器
1. 需求 输入两个整数,点击 “点击相加” 按钮,显示计算结果。 2.准备工作 创建Spring Boot项目,引入Spring Web依赖,把前端代码放入static目录下。 2.1 前端代码 <!DOCTYPE html> <html lang"en"> <h…...
观察者模式和MQ是什么关系
观察者模式(Observer Pattern)和MQ(Message Queue,消息队列)之间的关系主要体现在它们所实现的功能和机制上的相似性,尽管它们在技术实现和应用场景上有所不同。 观察者模式 观察者模式是一种行为型设计模…...
JDK动态代理和CGLIB动态代理案例分析
JDK动态代理和CGLIB动态代理案例分析 JDK动态代理和CGLIB动态代理的实现原理如下: JDK动态代理的实现原理: JDK动态代理是基于Java的反射机制实现的实现一个继承InvocationHandler接口的对象,重写invoke方法,invoke方法中可以在目…...
【数据结构-前缀哈希】力扣1124. 表现良好的最长时间段
给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大…...
电商平台产品ID|CDN与预渲染|前端边缘计算
技术实现 都是通过ID拿到属性,进行预渲染html,通过 oss 分发出去 详情页这种基本都是通过 ssr 渲染出来,然后上缓存 CDN 分发到边缘节点来处理,具体逻辑可以参考 淘宝——EdgeRoutine边缘计算(CDNServerless 边缘计算…...
LATTICE进阶篇DDR2--(4)DDR2 IP核总结
一、IP核的时钟框架 1片DDR2的接口是16位,且DDR2是双边沿读取的, 故当DDR2芯片的时钟为200M时,右侧DDR2芯片上的数据吞吐率为200M*2*16b,左侧数据吞吐率为200M*32b,左右两侧数据吞吐量相等。 根据上规律可知…...
windows下php安装kafka
下载zookeeper Kafka 依赖 Zookeeper 进行分布式协调,所以需要下载Zookeeper ,当然你也可以使用kafka包里自带的一个默认配置的 Zookeeper。这里我们单独下载一个 访问Zookeeper官方下载页面在页面中找到最新的稳定版本,点击相应的下载链接…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...
