当前位置: 首页 > news >正文

Java8 - Stream API 处理集合数据

Java 8的Stream API提供了一种功能强大的方式来处理集合数据,以函数式和声明式的方式进行操作。Stream API允许您对元素集合执行操作,如过滤、映射和归约,以简洁高效的方式进行处理。

下面是Java 8 Stream API的一些关键特性和概念:

① 创建流:您可以从各数据源创建流,如集合、数组或I/O通道。

② 中间操作:Stream提供了一组中间操作,可以链接在一起对数据进行转换或过滤。一些常见的中间操作包括filter、map、flatMap、distinct、sorted和limit。

③ 终端操作:终端操作用于生成结果或产生副作用。终端操作的示例包括forEach、collect、reduce、min、max和count。

④ 惰性求值:Stream支持惰性求值,这意味着中间操作只有在调用终端操作时才会执行。这样可以高效处理大型数据集。

⑤ 并行处理:Stream API还支持并行处理,允许您利用多核处理器加速对大型数据集的操作。您可以使用parallel或parallelStream方法将顺序流转换为并行流。

01. map 函数

通过使用map函数,我们可以对流中的每个元素进行转换操作,从而得到一个新的流。这种转换可以是类型转换、属性提取、计算等。

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Person {private String name;private Integer age;
}
@Test
public void test0() {List<Person> list = Arrays.asList(new Person("zhangsan", 10),new Person("zhangsan", 11),new Person("wangwu", 12));//(1) map函数将list中的每个Person对象映射为其name属性,并使用collect()方法将新的流收集到一个新的列表nameList中List<String> nameList = list.stream().map(person -> {return person.getName();}).collect(Collectors.toList());System.out.println(nameList);  // [zhangsan, zhangsan, wangwu]//(2) map函数将list中的每个Person对象映射为其年龄,并将映射后的结果收集到一个新的整数列表ageList中List<Integer> ageList = list.stream().map(Person::getAge).collect(Collectors.toList());System.out.println(ageList);//(3) map函数将list中的每个Person对象映射为其年龄加1后的整数,并使用collect方法将映射后的结果收集到一个新的列表ageList1中List<Integer> ageList1 = list.stream().map(person -> {return person.getAge() + 1;}).collect(Collectors.toList());//(4) map函数将list中的每个Person对象的名称转换为大写形式,并将结果收集到一个新的字符串列表uppercaseNames中。List<String> uppercaseNames = list.stream().map(person -> {return person.getName().toUpperCase();}).collect(Collectors.toList());
}

02. mapToInt函数

mapToInt是Stream接口提供的一个方法,用于将流中的元素映射为int类型的值。它接受一个ToIntFunction参数,用于指定如何将流中的元素映射为int类型的值。

@Test
public void test14() {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// map 函数Stream<Integer> stream = numbers.stream().map(n -> n * n);List<Integer> list1 = stream.collect(Collectors.toList());System.out.println(list1);// mapToInt 函数IntStream intStream = numbers.stream().mapToInt(n -> n * n);int sum = intStream.sum(); // 求和// OptionalDouble average = intStream.average(); // 平均值// OptionalInt max = intStream.max(); // 最大值// OptionalInt min = intStream.min(); // 最小值
}

map和mapToInt都是Stream接口提供的方法,用于对流中的元素进行映射转换。它们的区别在于返回值的类型和适用范围:

① map方法接受一个Function参数,用于指定如何将流中的元素映射为其他类型的值。它返回一个新的流,其中包含映射后的值。返回的流是一个泛型流,即Stream,其中R是映射后的值的类型。

② mapToInt方法也接受一个Function参数,用于指定如何将流中的元素映射为int类型的值。它返回一个新的IntStream,其中包含映射后的int值。返回的流是一个特殊的流,专门用于处理int类型的值,提供了更高效的操作和更少的内存消耗。

需要注意的是,IntStream提供了一些特殊的操作,例如sum、average、max、min等,这些操作只适用于IntStream,而不适用于泛型流Stream。如果需要对映射后的值进行这些特殊操作,应该使用mapToInt方法。

除了mapToInt方法,Stream接口还提供了其他一些类似的映射方法,如mapToLong和mapToDouble,用于将流中的元素映射为long类型和double类型的值。

03. filter 函数

通过使用filter函数,我们可以根据指定的条件过滤出流中满足条件的元素,从而得到一个新的流。这种过滤可以是基于元素的某个属性、某种关系或其他条件。

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Person {private String name;private Integer age;
}
@Test
public void test1() {List<Person> list = Arrays.asList(new Person("zhangsan", 10),new Person("zhangsan", 11),new Person("wangwu", 12));// filter函数过滤出列表中Person对象的name为zhangsan的元素,最后使用collect方法将过滤后的结果收集到一个新的列表中。List<Person> list1 = list.stream().filter(person -> {return person.getName().equals("zhangsan");}).collect(Collectors.toList());System.out.println(list1); // [Person(name=zhangsan, age=10), Person(name=zhangsan, age=11)]// 简洁写法List<Person> list2 = list.stream().filter(person -> person.getName().equals("zhangsan")).collect(Collectors.toList());// filter函数过滤出列表中Person对象的age为偶数的元素,最后使用collect方法将过滤后的结果收集到一个新的列表中。List<Person> list3 = list.stream().filter(person -> person.getAge() % 2 == 0).collect(Collectors.toList());System.out.println(list3); // [Person(name=zhangsan, age=10), Person(name=wangwu, age=12)]
}

04. flatMap 函数

flatMap函数是一种中间操作,用于对流中的每个元素进行映射操作,并将映射结果扁平化为一个新的流。

① flatMap函数将每个子列表映射为一个流,并将这些流扁平化为一个新的流:

@Test
public void test2() {// 首先创建一个嵌套的整数列表nestedList,其中包含了三个子列表。List<List<Integer>> nestedList = Arrays.asList(Arrays.asList(1, 2, 3),Arrays.asList(4, 5, 6),Arrays.asList(7, 8, 9));// flatMap函数将每个子列表映射为一个流,并将这些流扁平化为一个新的流,最后使用collect方法将扁平化后的结果收集到一个新的整数列表flattenedList中。List<Integer> flattenedList = nestedList.stream().flatMap(list->{return list.stream();}).collect(Collectors.toList());// 简洁写法List<Integer> collect = nestedList.stream().flatMap(List::stream).collect(Collectors.toList());System.out.println(collect);
}

② 使用flatMap函数将list中每个Person对象的ids列表扁平化为一个新的流:

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Person {List<Integer> ids;private String name;private Integer age;public Person(String name,Integer age){this.name = name;this.age = age;}
}
@Test
public void test3() {Person qo1 = new Person("zhangsan",10);qo1.setIds(Arrays.asList(1,2,3));Person qo2 = new Person("zhangsan",11);qo2.setIds(Arrays.asList(4,5,6));Person qo3 = new Person("wangwu",12);qo3.setIds(Arrays.asList(7,8,9));List<Person> list = new ArrayList<>();list.add(qo1);list.add(qo2);list.add(qo3);List<Integer> list1 = list.stream().flatMap(Person -> {return Person.getIds().stream();}).collect(Collectors.toList());System.out.println(list1); // [1, 2, 3, 4, 5, 6, 7, 8, 9]List<List<Integer>> list2 = list.stream().map(Person -> {return Person.getIds();}).collect(Collectors.toList());System.out.println(list2); // [[1, 2, 3], [4, 5, 6], [7, 8, 9]]List<Integer> list3 = list.stream().flatMap(Person -> {return Optional.ofNullable(Person.getIds()).orElse(new ArrayList<>()).stream();}).collect(Collectors.toList());System.out.println(list3); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
}

05. distinct 函数

distinct函数是一种中间操作,用于去除流中的重复元素,保留唯一的元素。它会根据元素的equals方法进行比较来判断元素是否重复。

@Test
public void test4() {List<Integer> list = Arrays.asList(1, 1, 2, 2, 3, 3, 4, 5);List<Integer> list1 = list.stream().distinct().collect(Collectors.toList());System.out.println(list1);
}

如果想要根据对象的属性进行去重,您可以使用Java 8的Stream API结合distinct函数和自定义的equals和hashCode方法来实现。

@NoArgsConstructor
@AllArgsConstructor
@Data
public
class Person {private String name;private int age;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age && Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}
@Test
public void test5() {List<Person> list = Arrays.asList(new Person("zhangsan", 10),new Person("zhangsan", 10),new Person("wangwu", 12));List<Person> collect = list.stream().distinct().collect(Collectors.toList());System.out.println(collect); // [Person(name=zhangsan, age=10), Person(name=wangwu, age=12)]
}

06. sorted 函数

sorted函数是一种中间操作,用于对流中的元素进行排序。它可以按照自然顺序或者通过自定义的比较器进行排序。

① sorted():按照自然顺序对流中的元素进行排序。

@Test
public void test6() {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]
}

② sorted(Comparator<? super T> comparator):根据自定义的比较器对流中的元素进行排序。

@Test
public void test7() {List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 3);List<Integer> sortedNumbers = numbers.stream().sorted(new Comparator<Integer>() {@Overridepublic int compare(Integer obj1, Integer obj2) {// 倒序排序return obj2-obj1;}}).collect(Collectors.toList());System.out.println(sortedNumbers); // [8, 5, 3, 2, 1]// 降序排序List<Integer> collect = numbers.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
}

07. limit 函数

limit 函数是一种中间操作,用于截取流中的前n个元素。它会返回一个新的流,其中包含原始流中的前n个元素。

@Test
public void test8() {List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 3);// 截取列表中的前3个元素List<Integer> list1 = numbers.stream().limit(3).collect(Collectors.toList());System.out.println(list1); // [5, 2, 8]// 对列表中的元素排序,再截取列表中的前3个元素List<Integer> list2 = numbers.stream().sorted().limit(3).collect(Collectors.toList());System.out.println(list2); // [1, 2, 3]
}

08. min 函数

min函数是一种终端操作,用于找到流中的最小元素。它接受一个Comparator函数作为参数,用于确定元素的顺序。通过使用min函数,我们可以方便地找到流中的最小元素。这对于需要找到最小值或根据某个属性进行排序的场景非常有用。

@Test
public void test9() {List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 3);// min函数并传入比较器,找到流中的最小值Optional<Integer> optional = numbers.stream().min(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {// 正序排序return o1 - o2;}});// 简洁写法Optional<Integer> optional1 = numbers.stream().min(Integer::compareTo);// 使用Optional类来处理可能为空的结果,并打印输出最小值if(optional.isPresent()){System.out.println(optional.get()); // 1}else {System.out.println("Stream is empty");}
}@Test
public void test10() {List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 3);// min函数并传入比较器Optional<Integer> optional = numbers.stream().min(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {// 倒叙排序return o2-o1;}});// 使用Optional类来处理可能为空的结果if(optional.isPresent()){System.out.println(optional.get()); // 8}else {System.out.println("Stream is empty");}
}

09. max 函数

max函数是一种终端操作,用于找到流中的最大元素。它接受一个Comparator函数作为参数,用于确定元素的顺序。

@Test
public void test11() {List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 3);// max函数并传入比较器Optional<Integer> optional = numbers.stream().max(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {// 正序排序return o1-o2;}});// 简洁写法Optional<Integer> optional1 = numbers.stream().max(Integer::compareTo);// 使用Optional类来处理可能为空的结果if(optional.isPresent()){System.out.println(optional.get()); // 8}else {System.out.println("Stream is empty");}
}

10. count 函数

count函数是一种终端操作,用于计算流中的元素数量。它返回一个long类型的值,表示流中的元素个数。

@Test
public void test12() {List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 3);System.out.println(numbers.stream().count()); // 5
}

11. groupby 函数

groupBy函数,用于对流中的元素进行分组。groupBy函数接受一个Function参数,用于指定分组的依据。它将流中的元素按照该函数的返回值进行分组,并返回一个Map对象,其中键是分组的依据,值是属于该分组的元素列表。

@Test
public void test12() {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 使用 n -> n % 2 == 0 ? "偶数" : "奇数"作为分组的依据,将整数列表按照奇偶数进行分组。// 最终得到的groups对象是一个Map,其中键是"奇数"和"偶数",值是属于该分组的整数列表。Map<String, List<Integer>> groups = numbers.stream().collect(Collectors.groupingBy(n -> n % 2 == 0 ? "偶数" : "奇数"));System.out.println(groups); // {偶数=[2, 4, 6, 8, 10], 奇数=[1, 3, 5, 7, 9]}
}

还可以使用groupBy函数按照对象的属性进行分组。

@Test
public void test13() {List<Person> list = Arrays.asList(new Person("zhangsan", 10),new Person("lisi", 10),new Person("wangwu", 12));Map<Integer, List<Person>> map = list.stream().collect(Collectors.groupingBy(person -> person.getAge()));// Map<Integer, List<Person>> map = list.stream().collect(Collectors.groupingBy(Person::getAge));System.out.println(map); // {10=[Person(name=zhangsan, age=10), Person(name=lisi, age=10)], 12=[Person(name=wangwu, age=12)]}
}

相关文章:

Java8 - Stream API 处理集合数据

Java 8的Stream API提供了一种功能强大的方式来处理集合数据&#xff0c;以函数式和声明式的方式进行操作。Stream API允许您对元素集合执行操作&#xff0c;如过滤、映射和归约&#xff0c;以简洁高效的方式进行处理。 下面是Java 8 Stream API的一些关键特性和概念&#xff…...

漫步5G-A City,一份独属于上海的浪漫

作家亨利詹姆斯曾写道&#xff0c;“城市漫步&#xff0c;让我接触到了这个世界上最好的东西”。 用漫无目的地行走&#xff0c;来体验和观察一座城市&#xff0c;上海凭借丰富多元的文化特质&#xff0c;成为citywalk这种浪漫生活方式的流行地。 无论你是漫步在美术馆、画廊林…...

SpringBoot 如何处理跨域请求?你说的出几种方法?

引言&#xff1a;在现代的Web开发中&#xff0c;跨域请求&#xff08;Cross-Origin Resource Sharing&#xff0c;CORS&#xff09;是一个常见的挑战。随着前后端分离架构的流行&#xff0c;前端应用通常运行在一个与后端 API 不同的域名或端口上&#xff0c;这就导致了浏览器的…...

OV SSL证书年度成本概览:为企业安全护航的经济之选

在当今数字化时代&#xff0c;企业网站不仅是品牌展示的窗口&#xff0c;更是与客户沟通的桥梁。然而&#xff0c;随着网络威胁的不断升级&#xff0c;保护网站安全成为了企业不可忽视的任务。SSL证书&#xff0c;特别是OV SSL证书&#xff0c;因其对企业身份的严格验证&#x…...

歌尔气压计SPA06-003在无人机的创新应用

随着科技的不断进步&#xff0c;各类智能设备的功能日益强大&#xff0c;其中气压计作为一种能够测量大气压力的传感器&#xff0c;已被广泛应用于多种领域。歌尔气压计以其高精度、低功耗的特点&#xff0c;在无人机和智能手表上的应用尤为突出&#xff0c;为这两个领域的产品…...

python3多文件操作

1 介绍 有两个.py文件&#xff0c;分别为main.py和util.py&#xff0c;执行main.py时&#xff0c;调用util.py当中的函数。 main.py内容如下&#xff0c; import util if __name__ "__main__":a [3.0,4.0]length util.get_length_from_vec(a)print(f"leng…...

312. 戳气球

312. 戳气球 题目链接&#xff1a;312. 戳气球 代码如下&#xff1a; //参考链接:https://leetcode.cn/problems/burst-balloons/solutions/336390/chuo-qi-qiu-by-leetcode-solution class Solution { public:int maxCoins(vector<int>& nums) {int nnums.size()…...

深入理解C++中的锁

目录 1.基本互斥锁&#xff08;std::mutex&#xff09; 2.递归互斥锁&#xff08;std::recursive_mutex&#xff09; 3.带超时机制的互斥锁&#xff08;std::timed_mutex&#xff09; 4.带超时机制的递归互斥锁&#xff08;std::recursive_timed_mutex&#xff09; 5.共享…...

压缩pdf文件大小,压缩pdf文件大小软件哪个好

在数字化时代&#xff0c;PDF文件因其卓越的跨平台兼容性和稳定性而成为工作与学习的好帮手。然而&#xff0c;当PDF文件体积过大时&#xff0c;传输和存储便成了一项挑战。别担心&#xff0c;本文将为你揭秘如何快速压缩PDF文件&#xff0c;让你的文档轻装上路&#xff01; 压…...

难道 Java 已经过时了?

当一门技术已经存在许多年了&#xff0c;它可能会失去竞争力&#xff0c;而后黯然退场&#xff0c;默默地离开&#xff0c;这对大部分的人来说就已经算是过时了。 Java 于 1995 年正式上线&#xff0c;至今已经走过了 27 个年头&#xff0c;在众多编程技术里算是年龄比较大的语…...

华为OD机考题(​HJ32 密码截取)

前言 经过前期的数据结构和算法学习&#xff0c;开始以OD机考题作为练习题&#xff0c;继续加强下熟练程度。有需要的可以同步练习下。 描述 Catcher是MCA国的情报员&#xff0c;他工作时发现敌国会用一些对称的密码进行通信&#xff0c;比如像这些ABBA&#xff0c;ABA&…...

【高考志愿】测绘科学与技术

目录 一、专业介绍 1.1 专业概述 1.2 专业方向 1.3 课程内容 二、就业前景 三、报考注意事项 四、测绘科学与技术专业排名 五、职业规划与未来发展 高考志愿选择测绘科学与技术专业&#xff0c;对于许多有志于空间信息技术领域发展的学生来说&#xff0c;无疑是一个极具…...

SpringBoot异步接口实现 提升吞吐量

前言 Servlet 3.0之前&#xff1a;HTTP请求由单一线程处理。Servlet 3.0之后&#xff1a;支持异步处理&#xff0c;提高系统吞吐量。 SpringBoot 异步接口实现方式 AsyncContext&#xff1a;Servlet层级&#xff0c;不常用。Callable&#xff1a;使用java.util.concurrent.C…...

C语言快速学习笔记

学习网站&#xff1a;C 语言教程 | 菜鸟教程 (runoob.com)C 语言教程 | 菜鸟教程 (runoob.com)C 语言教程 | 菜鸟教程 (runoob.com) 这个网站知识完整&#xff0c;讲解清晰。 在线C语言编程工具&#xff1a;菜鸟教程在线编辑器 (runoob.com) 国外学习网站&#xff1a;C语言介…...

如何选择易用性高的项目管理软件?

随着项目管理在各行各业的广泛应用&#xff0c;选择一款易用性高的项目管理软件变得越来越重要。易用性高的软件可以帮助企业提高工作效率&#xff0c;降低管理成本&#xff0c;同时还能提升团队之间的协作能力。那么&#xff0c;如何选择一款易用性高的项目管理软件呢&#xf…...

vue3基于uni-app 封装小程序request请求

const BASE_URL https://47.122.26.142; // 替换为你的 API 基础 URL const token uni.getStorageSync(token);const request (url: string, method: any, data {}, headers {}) > {return new Promise((resolve, reject) > {uni.request({url: ${BASE_URL}${url},m…...

YOLO在目标检测与视频轨迹追踪中的应用

YOLO在目标检测与视频轨迹追踪中的应用 引言 在计算机视觉领域&#xff0c;目标检测与视频轨迹追踪是两个至关重要的研究方向。随着深度学习技术的飞速发展&#xff0c;尤其是卷积神经网络&#xff08;CNN&#xff09;的广泛应用&#xff0c;目标检测与视频轨迹追踪的性能得到…...

版本控制系统:Git 纯应用(持续更新)

基本操作 ctrl上行键&#xff1a;上次代码 本地仓库&#xff1a;Git init 新建文件&#xff1a;touch xxxx.xxx 查看状态&#xff1a;Git status 文件从工作区——暂存区&#xff1a;Git add ./文件名(.是通配符代表所有) 暂存区——仓库&#xff1a;Git commit -m &…...

从0开始搭建vue项目

#先查下电脑有没有安装过node和npm node -v npm -v #安装vue npm install -g vue #安装webpack npm install webpack -g 都安装好后&#xff0c;进入你想创建的文件夹内 创建名字&#xff1a;vue init webpack <project_name> 就默认回车 然后根据项目需求Y/n 比如…...

Java框架常见面试题

在Java框架面试中&#xff0c;面试官通常会考察候选人对常见Java框架的理解、使用经验以及解决问题的能力。以下是一些常见的Java框架面试题及其详细回答&#xff1a; 1. Spring框架相关问题 问题&#xff1a;Spring框架的核心组件有哪些&#xff1f;它们各自的作用是什么&am…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

DiscuzX3.5发帖json api

参考文章&#xff1a;PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下&#xff0c;适配我自己的需求 有一个站点存在多个采集站&#xff0c;我想通过主站拿标题&#xff0c;采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器

一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下&#xff0c;音视频内容犹如璀璨繁星&#xff0c;点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频&#xff0c;到在线课堂中知识渊博的专家授课&#xff0c;再到影视平台上扣人心弦的高清大片&#xff0c;音…...