Java的Stream流和Option类
1. Stream 流
背景
Stream
是Java 8引入的一个用于处理集合(或其他数据源)中的元素的API。它提供了一种声明式的方式来处理数据,并可以链式调用。Stream
支持惰性求值,也支持并行流处理。
1.1 创建 Stream
创建一个Stream可以通过多种方式,不同的数据源(如集合、数组、生成器等)提供了不同的创建方法。
1.1.1 使用集合创建 Stream
- 方法:
stream()
方法可以用于集合类,如List
、Set
等,返回一个顺序流。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = list.stream();
stream.forEach(System.out::println); // 输出 1, 2, 3, 4, 5
1.1.2 使用 Arrays 创建 Stream
- 方法:
Arrays.stream()
可以从数组创建 Stream。
int[] numbers = {1, 2, 3, 4, 5};
IntStream stream = Arrays.stream(numbers);
stream.forEach(System.out::println); // 输出 1, 2, 3, 4, 5
1.1.3 使用 Stream.of()
- 方法:
Stream.of()
创建包含指定元素的Stream。
Stream<String> stream = Stream.of("Apple", "Banana", "Cherry");
stream.forEach(System.out::println); // 输出 Apple, Banana, Cherry
1.1.4 使用生成器
- 方法:
Stream.generate()
和Stream.iterate()
用于生成无限流。
Stream<Double> randomNumbers = Stream.generate(Math::random);
randomNumbers.limit(5).forEach(System.out::println); // 输出5个随机数Stream<Integer> evenNumbers = Stream.iterate(0, n -> n + 2);
evenNumbers.limit(5).forEach(System.out::println); // 输出 0, 2, 4, 6, 8
1.2 中间操作
中间操作是惰性求值的,它们返回一个新的Stream对象,允许链式调用。常见的中间操作包括 filter()
, map()
, flatMap()
, distinct()
, sorted()
等。
1.2.1 filter()
- 作用:过滤出符合条件的元素。
- 签名:
Stream<T> filter(Predicate<? super T> predicate)
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
System.out.println(evenNumbers); // 输出 [2, 4, 6, 8, 10]
1.2.2 map()
- 作用:对流中的每个元素应用给定的函数,生成一个新的流。
- 签名:
<R> Stream<R> map(Function<? super T, ? extends R> mapper)
List<String> words = Arrays.asList("hello", "world", "java");
List<String> upperCaseWords = words.stream().map(String::toUpperCase).collect(Collectors.toList());
System.out.println(upperCaseWords); // 输出 [HELLO, WORLD, JAVA]
1.2.3 flatMap()
- 作用:将流中的元素转换成另一个流,然后将多个流合并为一个流。通常用于处理包含集合或数组的流。
- 签名:
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
List<List<String>> listOfLists = Arrays.asList(Arrays.asList("A", "B", "C"),Arrays.asList("D", "E", "F")
);
List<String> flatList = listOfLists.stream().flatMap(List::stream).collect(Collectors.toList());
System.out.println(flatList); // 输出 [A, B, C, D, E, F]
1.2.4 distinct()
- 作用:去重,返回一个只包含不同元素的流。
- 签名:
Stream<T> distinct()
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);
List<Integer> distinctNumbers = numbers.stream().distinct().collect(Collectors.toList());
System.out.println(distinctNumbers); // 输出 [1, 2, 3, 4, 5]
1.2.5 sorted()
- 作用:对流中的元素进行排序。
- 签名:
Stream<T> sorted()
List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 3);
List<Integer> sortedNumbers = numbers.stream().sorted().collect(Collectors.toList());
System.out.println(sortedNumbers); // 输出 [1, 2, 3, 5, 8]
1.2.6 anyMatch(), allMatch(), noneMatch()
-
作用:这些方法用于匹配流中的元素:
anyMatch()
检查流中是否至少有一个元素满足条件。allMatch()
检查流中的所有元素是否都满足条件。noneMatch()
检查流中是否没有元素满足条件。
-
签名:
boolean anyMatch(Predicate<? super T> predicate)
boolean allMatch(Predicate<? super T> predicate)
boolean noneMatch(Predicate<? super T> predicate)
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean anyGreaterThan3 = numbers.stream().anyMatch(n -> n > 3); // true
boolean allGreaterThan0 = numbers.stream().allMatch(n -> n > 0); // true
boolean noneNegative = numbers.stream().noneMatch(n -> n < 0); // true
System.out.println(anyGreaterThan3); // 输出 true
System.out.println(allGreaterThan0); // 输出 true
System.out.println(noneNegative); // 输出 true
1.2.7 peek()
- 作用:
peek()
用于在中间操作中查看流中的每个元素。通常用于调试。 - 签名:
Stream<T> peek(Consumer<? super T> action)
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = numbers.stream().peek(n -> System.out.println("Before filter: " + n)).filter(n -> n % 2 == 0).collect(Collectors.toList());
1.3 终止操作
终止操作会触发流的处理,并生成一个最终的结果或副作用。常见的终止操作包括 collect()
, forEach()
, reduce()
, count()
, min()
等。
1.3.1 collect()
- 作用:将流转换为集合或其他类型的结果。
- 签名:
<R, A> R collect(Collector<? super T, A, R> collector)
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
System.out.println(evenNumbers); // 输出 [2, 4]
1.3.2 forEach()
- 作用:对流中的每个元素执行给定的操作。
- 签名:
void forEach(Consumer<? super T> action)
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream().forEach(n -> System.out.println(n)); // 输出 1, 2, 3, 4, 5
1.3.3 reduce()
- 作用:将流中的元素结合成一个单一的结果,常用于求和、求积等操作。
- 签名:
T reduce(T identity, BinaryOperator<T> accumulator)
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().reduce(0, (a, b) -> a + b);
System.out.println(sum); // 输出 15
1.3.4 count()
- 作用:计算流中的元素个数。
- 签名:
long count()
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
long count = numbers.stream().filter(n -> n % 2 == 0).count();
System.out.println(count); // 输出 2
1.3.5 min() 和 max()
- 作用:找到流中的最小值或最大值。
- 签名:
Optional<T> min(Comparator<? super T> comparator)
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> min = numbers.stream().min(Integer::compare);
System.out.println(min.get()); // 输出 1
1.3.6 findFirst() 和 findAny()
- 作用:这两个方法用于获取流中的元素。
findFirst()
返回第一个元素。findAny()
返回任意元素(并行流时表现不同)。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> first = numbers.stream().findFirst();
Optional<Integer> any = numbers.stream().findAny();
System.out.println(first.get()); // 输出 1
System.out.println(any.get()); // 输出 任意一个数
总结
- Stream 提供了更简洁、声明式的方式处理数据流。
- 中间操作如
filter()
,map()
,flatMap()
等支持链式操作,实现强大的数据处理能力。 - 终止操作则触发最终的处理过程,如
collect()
,forEach()
,reduce()
等。
2. Optional 类
背景
Optional
是 Java 8 引入的一个容器类,用于解决传统 null
引用带来的 NullPointerException
问题。它表示一个可能为 null
的值,而不是直接使用 null
,通过提供多种方法使得 Optional
的值可以更安全地处理。
Optional
主要用于以下几种场景:
- 避免
null
值:避免直接返回或传递null
,提高代码的可读性和安全性。 - 链式操作:允许对可能为
null
的值进行安全的链式调用,而不必担心NullPointerException
。
2.1 创建 Optional
2.1.1 Optional.of()
- 作用:创建一个非空的
Optional
,如果值为null
,则抛出NullPointerException
。 - 签名:
static <T> Optional<T> of(T value)
Optional<String> optional = Optional.of("Hello");
System.out.println(optional.get()); // 输出 Hello
- 注意:传入
null
会抛出异常。
Optional<String> optional = Optional.of(null); // 会抛出 NullPointerException
2.1.2 Optional.ofNullable()
- 作用:创建一个
Optional
,如果值为null
,则返回一个空的Optional
。 - 签名:
static <T> Optional<T> ofNullable(T value)
Optional<String> optional = Optional.ofNullable("Hello");
System.out.println(optional.get()); // 输出 HelloOptional<String> emptyOptional = Optional.ofNullable(null);
System.out.println(emptyOptional.isPresent()); // 输出 false
2.1.3 Optional.empty()
- 作用:创建一个空的
Optional
对象。 - 签名:
static <T> Optional<T> empty()
Optional<String> emptyOptional = Optional.empty();
System.out.println(emptyOptional.isPresent()); // 输出 false
2.2 常用方法
2.2.1 isPresent()
- 作用:检查
Optional
是否包含一个非空的值。 - 签名:
boolean isPresent()
Optional<String> optional = Optional.of("Hello");
System.out.println(optional.isPresent()); // 输出 trueOptional<String> emptyOptional = Optional.empty();
System.out.println(emptyOptional.isPresent()); // 输出 false
2.2.2 ifPresent()
- 作用:如果
Optional
中有值,则执行给定的操作;如果没有值,则什么也不做。 - 签名:
void ifPresent(Consumer<? super T> action)
Optional<String> optional = Optional.of("Hello");
optional.ifPresent(System.out::println); // 输出 HelloOptional<String> emptyOptional = Optional.empty();
emptyOptional.ifPresent(System.out::println); // 不输出任何内容
2.2.3 get()
- 作用:获取
Optional
中的值,如果值不存在,会抛出NoSuchElementException
。 - 签名:
T get()
Optional<String> optional = Optional.of("Hello");
System.out.println(optional.get()); // 输出 HelloOptional<String> emptyOptional = Optional.empty();
// emptyOptional.get(); // 会抛出 NoSuchElementException
2.2.4 orElse()
- 作用:如果
Optional
中有值,返回该值;如果没有值,返回提供的默认值。 - 签名:
T orElse(T other)
Optional<String> optional = Optional.of("Hello");
System.out.println(optional.orElse("Default Value")); // 输出 HelloOptional<String> emptyOptional = Optional.empty();
System.out.println(emptyOptional.orElse("Default Value")); // 输出 Default Value
2.2.5 orElseGet()
- 作用:与
orElse()
类似,但orElseGet()
使用Supplier
提供默认值,这样可以延迟计算。 - 签名:
T orElseGet(Supplier<? extends T> supplier)
Optional<String> optional = Optional.of("Hello");
System.out.println(optional.orElseGet(() -> "Default Value")); // 输出 HelloOptional<String> emptyOptional = Optional.empty();
System.out.println(emptyOptional.orElseGet(() -> "Default Value")); // 输出 Default Value
2.2.6 orElseThrow()
- 作用:如果
Optional
中有值,返回该值;如果没有值,抛出指定的异常。 - 签名:
T orElseThrow(Supplier<? extends X> exceptionSupplier)
Optional<String> optional = Optional.of("Hello");
System.out.println(optional.orElseThrow(() -> new IllegalArgumentException("Value is missing"))); // 输出 HelloOptional<String> emptyOptional = Optional.empty();
// emptyOptional.orElseThrow(() -> new IllegalArgumentException("Value is missing")); // 会抛出 IllegalArgumentException
2.2.7 map()
- 作用:如果
Optional
中有值,应用给定的映射函数返回一个新的Optional
,如果没有值,则返回一个空的Optional
。 - 签名:
<U> Optional<U> map(Function<? super T, ? extends U> mapper)
Optional<String> optional = Optional.of("Hello");
Optional<String> upperCaseOptional = optional.map(String::toUpperCase);
System.out.println(upperCaseOptional.get()); // 输出 HELLOOptional<String> emptyOptional = Optional.empty();
System.out.println(emptyOptional.map(String::toUpperCase).isPresent()); // 输出 false
2.2.8 flatMap()
- 作用:类似于
map()
,但flatMap()
返回的是一个Optional
。通常用于处理返回值本身可能为Optional
的情况。 - 签名:
<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
Optional<String> optional = Optional.of("Hello");
Optional<String> result = optional.flatMap(value -> Optional.of(value.toUpperCase()));
System.out.println(result.get()); // 输出 HELLOOptional<String> emptyOptional = Optional.empty();
System.out.println(emptyOptional.flatMap(value -> Optional.of(value.toUpperCase())).isPresent()); // 输出 false
2.2.9 filter()
- 作用:如果
Optional
中有值并且满足给定的条件,则返回一个包含该值的Optional
,否则返回一个空的Optional
。 - 签名:
Optional<T> filter(Predicate<? super T> predicate)
Optional<Integer> optional = Optional.of(5);
Optional<Integer> result = optional.filter(n -> n > 3);
System.out.println(result.get()); // 输出 5Optional<Integer> result2 = optional.filter(n -> n < 3);
System.out.println(result2.isPresent()); // 输出 false
2.2.10 ifPresentOrElse()
- 作用:如果
Optional
中有值,执行给定的操作,否则执行提供的另一个操作。 - 签名:
void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
Optional<String> optional = Optional.of("Hello");
optional.ifPresentOrElse(value -> System.out.println("Value: " + value), // 输出 Value: Hello() -> System.out.println("Value is absent")
);Optional<String> emptyOptional = Optional.empty();
emptyOptional.ifPresentOrElse(value -> System.out.println("Value: " + value),() -> System.out.println("Value is absent") // 输出 Value is absent
);
2.3 使用场景
2.3.1 使用 Optional
返回可能为 null
的值
在方法中返回 Optional
而非直接返回 null
,避免客户端代码中直接进行 null
值检查。
public Optional<String> findUserById(int userId) {User user = userRepository.findById(userId);return Optional.ofNullable(user != null ? user.getName() : null);
}Optional<String> name = findUserById(1);
name.ifPresent(System.out::println); // 如果值存在,打印用户名
2.3.2 使用 Optional
简化链式调用
Optional
可以避免 null
检查,并通过 map()
、flatMap()
、filter()
等方法方便地进行链式调用。
public Optional<Address> getUserAddress(User user) {return Optional.ofNullable(user).map(User::getAddress);
}Optional<Address> address = getUserAddress(user);
address.ifPresent(addr -> System.out.println("Address: " + addr.getStreet()));
总结
Optional
提供了一种优雅的方式来处理可能为null
的值,避免了NullPointerException
。- 常用方法如
map()
、filter()
、ifPresent()
、orElse()
、orElseThrow()
等,使得对Optional
的操作更加简洁且安全。 - 使用
Optional
可以有效提高代码的可读性和可维护性,尤其是在返回可能为null
的值时。
通过理解和使用 Optional
,可以显著降低出现空指针异常的风险,优化代码的健壮性。
相关文章:
Java的Stream流和Option类
1. Stream 流 背景 Stream是Java 8引入的一个用于处理集合(或其他数据源)中的元素的API。它提供了一种声明式的方式来处理数据,并可以链式调用。Stream支持惰性求值,也支持并行流处理。 1.1 创建 Stream 创建一个Stream可以通…...

深入理解ASP.NET Core 管道的工作原理
在 .NET Core 中,管道(Pipeline)是处理 HTTP 请求和响应的中间件组件的有序集合。每个中间件组件都可以对请求进行处理,并将其传递给下一个中间件组件,直到请求到达最终的处理程序。管道的概念类似于流水线,…...

多模态论文笔记——CLIP
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍这几年AIGC火爆的隐藏功臣,多模态模型:CLIP。 文章目录 CLIP(Contrastive Language-Image Pre-training)…...
brpc之baidu_protocol
简介 是brpc默认使用的协议 初始化 Protocol baidu_protocol { ParseRpcMessage,SerializeRequestDefault, PackRpcRequest,ProcessRpcRequest, ProcessRpcResponse,VerifyRpcRequest, NULL, NULL,CONNECTION_TYPE_ALL, "baidu_std" };协议定义 定义在baidu_rpc…...
LeetCode:39. 组合总和
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 cand…...

SOLID原则学习,开闭原则(Open Closed Principle, OCP)
文章目录 1. 定义2. 开闭原则的详细解释3. 实现开闭原则的方法4. 总结 1. 定义 开闭原则(Open-Closed Principle,OCP)是面向对象设计中的五大原则(SOLID)之一,由Bertrand Meyer提出。开闭原则的核心思想是…...

Unreal Engine 5 C++ Advanced Action RPG 七章笔记
第七章 Ranged Enemy 2-Ranged Enemy Starting Weapon 制作新敌人的流程准备 新敌人的武器起始的状态数据自己的战斗能力投射能力自己的行为树 创建角色,添加武器,添加数据,就是继承之前的基类敌人的 运行结果 3-Glacer Starting Stats 看看就行,就是复制曲线表格更改数…...

自动连接校园网wifi脚本实践(自动网页认证)
目录 起因执行步骤分析校园网登录逻辑如何判断当前是否处于未登录状态? 书写代码打包设置开机自动启动 起因 我们一般通过远程控制的方式访问实验室电脑,但是最近实验室老是断电,但重启后也不会自动连接校园网账户认证,远程工具&…...

HTTP/HTTPS ⑤-CA证书 || 中间人攻击 || SSL/TLS
这里是Themberfue ✨上节课我们聊到了对称加密和非对称加密,实际上,单纯地非对称加密并不能保证数据不被窃取,我们还需要一个更加重要的东西——证书 中间人攻击 通过非对称加密生成私钥priKey和公钥pubKey用来加密对称加密生成的密钥&…...

traceroute原理探究
文章中有截图,看不清的话,可以把浏览器显示比例放大到200%后观看。 linux下traceroute的原理 本文通过抓包观察一下linux下traceroute的原理 环境:一台嵌入式linux设备,内网ip是192.168.186.195,其上有192.168.202.…...
50_Lua垃圾回收
1.Lua垃圾回收机制概述 Lua采用了一种自动内存管理机制,称为垃圾回收(Garbage Collection, GC)。垃圾回收的主要目的是回收程序中不再被使用的内存,从而避免内存泄漏。Lua的垃圾回收器负责回收动态分配的对象,如函数、用户数据、表、字符串、线程、内部结构等。Lua的垃圾…...

Git-2-:Cherry-Pick 的使用场景及使用流程
前面我们说了 Git合并、解决冲突、强行回退等解决方案 >> 点击查看 这里再说一下 Cherry-Pick功能,Cherry-Pick不是merge,只是把部分功能代码Cherry-Pick到远程的目标分支 git cherry-pick功能简介: git cherry-pick 是用来从一个分…...

【C++】21.map和set的使用
文章目录 1. 序列式容器和关联式容器2. set系列的使用2.1 set和multiset参考文档2.2 set类的介绍2.3 set的构造和迭代器构造函数:双向迭代器迭代器: 2.4 set的增删查2.5 insert和迭代器遍历使用样例:2.6 find和erase使用样例:2.7 …...

burpsiute的基础使用(2)
爆破模块(intruder): csrf请求伪造访问(模拟攻击): 方法一: 通过burp将修改,删除等行为的数据包压缩成一个可访问链接,通过本地浏览器访问(该浏览器用户处于登陆状态&a…...
ElasticSearch 同义词匹配
synonym.txt 电脑, 计算机, 主机 复印纸, 打印纸, A4纸, 纸, A3 平板电脑, Pad DELETE /es_sku_index_20_20250109 PUT /es_sku_index_20_20250109 {"settings": {"index": {"number_of_shards": "5","number_of_replicas&quo…...

linux RT-Preempt spin lock实现
一、spin_lock概述 Spinlock是linux内核中常用的一种互斥锁机制,和mutex不同,当无法持锁进入临界区的时候,当前执行线索不会阻塞,而是不断的自旋等待该锁释放。正因为如此,自旋锁也是可以用在中断上下文的。也正是因为…...
PySpark广播表连接解决数据倾斜的完整案例
使用PySpark解决数据倾斜问题的完整案例,通过广播表连接的方式来优化性能。 准备数据 假设我们有两张表,一张大表 big_table 和一张小表 small_table ,小表将作为广播表。 from pyspark.sql import SparkSession# 初始化SparkSession spar…...

Chromium CDP 开发(十二):为自己的Domain建立custom_config.json
引言 本章详细介绍了如何为自定义的 CDP Domain 创建 custom_config.json 文件,并通过修改 BUILD.gn 文件来确保自定义的配置文件参与编译。我们通过 inspector_protocol_generate 配置段自动生成自定义 Domain 的头文件和实现文件,并成功将其集成到构建…...

【Vue】全局/局部组件使用流程(Vue2为例)
全局组件和局部组件区别 如何使用 全局组件:全局注册后,可以在任意页面中直接使用。局部组件:在页面中需要先导入子组件路径,注册组件才能使用。 适用场景 全局组件:适用于高频使用的组件,如导航栏、业…...
Vue.js组件开发详解
在现代前端开发中,Vue.js 凭借其简洁、高效、灵活的特性,成为了众多开发者的首选框架之一,而组件化开发则是 Vue.js 的核心优势。组件可以将复杂的 UI 界面拆分成一个个独立的、可复用的小块,极大地提高了开发效率和代码的可维护性…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...

mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...

算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...

CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)
漏洞概述 漏洞名称:Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号:CVE-2023-25194 CVSS评分:8.8 影响版本:Apache Kafka 2.3.0 - 3.3.2 修复版本:≥ 3.4.0 漏洞类型:反序列化导致的远程代…...