一分钟掌握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官方下载页面在页面中找到最新的稳定版本,点击相应的下载链接…...
【wiki知识库】09.欢迎页面展示(浏览量统计)SpringBoot部分
🍊 编程有易不绕弯,成长之路不孤单! 大家好,我是熊哈哈,这个项目从我接手到现在有了两个多月的时间了吧,其实本来我在七月初就做完的吧,但是六月份的时候生病了,在家里休息了一个月的…...
数据分析与应用:微信-情人节红包流向探索分析
目录 0 需求描述 1 红包发送方用户的基本信息缺失率有多高?(即有多少红包发送方用户无法在用户基本信息表中匹配? 2 哪一组红包金额的拒收率最高? 3、最受二线城市欢迎的红包金额为?(即发出次数最多) 4 北上广深 4 大城市中,哪座城市的男性用户发出的 520 红包比例…...
SQL,获取 ID 的历史状态
sas系统的表tb存储病人的医疗历史记录,当Visit_codeSurgery时表示手术,Visit_codeOffice表示咨询,每个病人有多条Visit_code,有时只有Surgery或只有Office:IdVisit_DateVisit_codeA305/15/2004SurgeryA302/5/2005Offic…...
阅文集团:摇不动的IP摇钱树
把IP当成摇钱树,要做“东方迪士尼” 今天我们聊——阅文集团 《热辣滚烫》《庆余年2》《与凤行》和《玫瑰的故事》很熟悉吧?影视“四连爆”, 阅文集团交出一份亮眼半年报,时隔两年,重启增长。 跟IP相关业务对收入贡献…...
ETL数据集成丨将SQL Server数据同步至Oracle的具体实现
一、背景 在构建企业级数据架构时,将SQL Server数据库的数据同步至数仓数据库(如Oracle)是一项至关重要的任务。这一过程不仅促进了跨系统数据的一致性与可用性,还为数据分析、商业智能以及决策支持系统提供了坚实的数据基础。 …...
20240814软考架构-------软考51-55答案解析
每日打卡题51-55答案 51、【2017年真题】 难度:一般 系统移植也是系统构建的一种实现方法,在移植工作中, 需要最终确定移植方法。 A.计划阶段 B.准备阶段 C.转换阶段 D.验证阶段 答案:A 解析: 移植工作大体上分为计划…...
JavaEE 的入门
1. 学习JavaEE Java EE(Java Platform Enterprise Edition), Java 平台企业版. 是JavaSE的扩展, ⽤于解决企业级的开 发需求, 所以也可以称之为是⼀组⽤于企业开发的Java技术标准. 所以, 学习JavaEE主要是学习Java在 企业中如何应⽤. 前⾯学习的是Java基础, JavaEE 主要学习Jav…...
vue3+ts 前端word文档下载文件时不预览直接下载方法(支持 doc / excel / ppt / pdf 等)
前端word文档下载文件时不预览直接下载方法支持 doc / excel / ppt / pdf 等 根据需要,要实现一个下载文档的需要 最简单的方法就是使用a标签 如果是相同域可以直接下载,但如果是不同域的,就会先打开一个预览页,在预览页再点下载…...
Java 空值与null 形参与实参学习
Java系列文章目录 文章目录 Java系列文章目录一、前言二、学习内容:三、问题描述四、解决方案:4.1 空值与null的区别4.1.1 空值(Empty Value)4.1.2 Null 4.2 形参与实参区别 五、总结:5.1 学习总结: 一、前…...
【QT常用技术讲解】QTableView添加QCheckBox、QPushButton
前言 QT展示列表信息的时候通常用到列表(比如用户信息、机构信息、设备信息等菜单),当需要对某列进行修改、删除操作时,就需要加入按钮(QPushButton),当需要对多列进行右键菜单操作时࿰…...
网站建设对于网络营销的意义/广州网页seo排名
在使用Loadrunner进行性能测试时,会用到自带的web Tours测试页面,里面提供了几种设置用来练习,主要还是用来练习关联,下面就个选项进行一个解释,作为一个初学者,有错误的地方望指出。1.Add extra HTML form…...
wordpress postgresql/seo快速上排名
Linux超文本交叉代码检索工具LXR(Linux Cross Reference),是由挪威奥斯陆大学数学系Arne Georg Gleditsch和Per Kristian Gjermshus编写的。这个工具实际上运行在Linux或者UNIX平台下,通过对源代码中的所有符号建立索引,从而可以方便的检索任…...
网页上一页下一页代码/seo到底是做什么的
Docker 安装 官方网站上有各种环境下的安装指南,比如:CentOS、Ubuntu 和 Debian 系列的安装。 而我们现在主要介绍的是基于 CentOS 7.x 上面的安装。 1、查看是否已经安装过docker [rootlocalhost ~]# yum list installed | grep docker docker.x86_64 …...
网站建设方案项目书/小红书seo软件
一、是什么 在以前文章 (opens new window)中,我们了解到生命周期定义 生命周期(Life Cycle)的概念应用很广泛,特别是在经济、环境、技术、社会等诸多领域经常出现,其基本涵义可以通俗地理解为“从摇篮到坟墓”(Cradle-to-Grave)的整个过程 跟Vue一样,React整个组件…...
济南模版网站/怎样交换友情链接
2019独角兽企业重金招聘Python工程师标准>>> 网关冗余与负载分担 读这篇文档之前,请读者先理清有关的专业术语和名词,尤其其中的同义词和并列词。 还要知道,人们之所以把计算机中的一些非常简单的逻辑复杂化,形成一个难…...
网站挂黑链赚钱/企业管理培训机构
Namedtuples在Python中用于命名小型数据集合.以这个命名元组为例:import collectionssesameEpisodeNTC collections.namedtuple(sesameEpisodeNTC,lead_character, has_elmo)se0 sesameEpisodeNTC(lead_characterbigbird, has_elmoFalse)可以将类定义(‘sesameEpi…...