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

【Lambda】java之lambda表达式stream流式编程操作集合

java之lambda表达式&stream流式编程操作集合

  • 1 stream流概念
    • 1.1 中间操作
      • 1.1.1 无状态操作
      • 1.1.2 有状态操作
    • 1.2 终端操作
      • 1.2.1 非短路操作
      • 1.2.2 短路操作
  • 2 steam流的生成
    • 2.1 方式一:数组转为stream流
    • 2.2 方式二:集合转为steam流
    • 2.3 方式三:Stream.builder创建stream流
    • 2.4 方式四:使用 Stream.of 方法
    • 2.5 方式五:从文件创建流
    • 2.6 方式六:生成无限流
  • 3 无状态的中间操作
    • 3.1 distinct
    • 3.2 limit
    • 3.3 skip
    • 3.4 sorted
    • 3.5 组合使用
  • 4 有状态的中间操作
    • 4.1 filter(重要)
    • 4.2 map(重要)
    • 4.3 flatMap
    • 4.4 peek
    • 4.5 组合使用
  • 5 非短路的终端操作
    • 5.1 forEach
    • 5.2 toArray
    • 5.3 reduce(重要)
    • 5.4 collect(重要)
    • 5.5 min、max、count
    • 5.6 组合使用
  • 6 短路的终端操作
    • 6.1 anyMatch
    • 6.2 allMatch
    • 6.3 noneMatch
    • 6.4 findFirst
    • 6.5 findAny
    • 6.6 组合使用
  • 7 并行流
  • 8 总结

1 stream流概念

简单来讲,Stream流是一种用于处理数据集合的高级迭代器,它可以对集合中的元素进行各种操作,如过滤、映射、排序等。通过使用Stream API,我们可以以声明式的方式处理数据,而无需显式地编写循环和条件语句。
Stream流的操作分为两种,中间操作终端操作

1.1 中间操作

是指对每个元素独立进行操作,不依赖于其他元素的状态。它们不会改变流中的元素本身,而是创建一个新的Stream对象来表示转换后的结果。常见的无状态中间操作有map、filter、flatMap等。

1.1.1 无状态操作

无状态操作不会改变流中的元素,也不会改变流的状态;这些操作可以并行执行,因为它们不依赖于流中的其他元素。例如:

  • distinct:返回去重的Stream。
  • limit:限制从流中获得前n个数据,返回前n个元素数据组成的Stream流。
  • skip:跳过前n个数据,返回第n个元素后面数据组成的Stream。sorted:返回一个排序的Stream。

1.1.2 有状态操作

有状态操作会改变流的状态,或者依赖于流中的其他元素。这些操作不能并行执行,因为它们需要访问或修改流的状态。
例如:

  • filter:过滤流,过滤流中的元素,返回一个符合条件的Stream
  • map:转换流,将一种类型的流转换为另外一种流。(mapToInt、mapToLong、mapToDouble 返回int、long、double基本类型对应的Stream)
  • peek:主要用来查看流中元素的数据状态,该方法主要用于调试,方便debug查看Stream内进行处理的每个元素。仅在对流内元素进行操作时,peek才会被调用,当不对元素做任何操作时,peek自然也不会被调用了
  • flatMap:简单的说,就是一个或多个流合并成一个新流。

1.2 终端操作

是对数据进行最终处理的操作,它们会消耗掉Stream并产生一个结果或者副作用(如输出到控制台)。一旦执行了终端操作,Stream就不能再被使用。常见的终端操作有collect、forEach、reduce等。

1.2.1 非短路操作

非短路操作会处理流中的所有元素,并返回一个结果。
如:

  • forEach:循环操作Stream中数据。
  • toArray:返回流中元素对应的数组对象。
  • reduce:聚合操作,用来做统计,将流中元素反复结合起来统计计算,得到一个值.。
  • collect:聚合操作,封装目标数据,将流转换为其他形式接收,如:List、Set、Map、Array。
  • min、max、count:聚合操作,最小值,最大值,总数量。

1.2.2 短路操作

短路操作会在满足某个条件时提前结束处理,并返回一个结果。例如:

  • anyMatch:短路操作,有一个符合条件返回true。
  • allMatch:所有数据都符合条件返回true。
  • noneMatch:所有数据都不符合条件返回true。
  • findFirst:短路操作,获取第一个元素。
  • findAny:短路操作,获取任一元素。

2 steam流的生成

2.1 方式一:数组转为stream流

int [] arr = {1,2,3,4,5,6,7,8,9,10};       
Arrays.stream(arr).forEach(System.out::println);

2.2 方式二:集合转为steam流

List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
list.stream().forEach(System.out::println);

2.3 方式三:Stream.builder创建stream流

Stream.builder创建stream流,允许你逐步构建一个流

Stream.Builder<Integer> builder = Stream.builder();// 添加元素到流中
builder.add(1);
builder.add(2);
builder.add(3);// 构建流
Stream<Integer> stream = builder.build();// 使用流
stream.forEach(System.out::println);

2.4 方式四:使用 Stream.of 方法

Stream.of 方法可以接受一系列元素并返回一个包含这些元素的流。

Stream<String> words = Stream.of("apple", "banana", "orange");
words.forEach(System.out::println);

2.5 方式五:从文件创建流

可以使用 Files.lines 方法从文件中创建流。

try (Stream<String> stream = Files.lines(Paths.get("file.txt"))) {stream.forEach(System.out::println);
} catch (IOException e) {e.printStackTrace();
}

2.6 方式六:生成无限流

可以使用 Stream.generate 或 Stream.iterate 方法来生成无限流。

Stream<Double> randomNumbers = Stream.generate(Math::random);
randomNumbers.forEach(System.out::println);
Stream<Integer> oddNumbers = Stream.iterate(1, n -> n + 2);
oddNumbers.forEach(System.out::println);

3 无状态的中间操作

3.1 distinct

返回一个去重的流,即去除重复的元素

Stream<Integer> distinctStream = Stream.of(1, 2, 2, 3, 4, 4, 5).distinct();
distinctStream.forEach(System.out::println);
//输出结果:12345

3.2 limit

限制从流中获得前n个数据,返回前n个元素数据组成的流

Stream<Integer> limitedStream = Stream.of(1, 2, 3, 4, 5).limit(3);
limitedStream.forEach(System.out::println);
//输出结果:123

3.3 skip

Stream<Integer> skippedStream = Stream.of(1, 2, 3, 4, 5).skip(2);
skippedStream.forEach(System.out::println);
//输出结果:345

3.4 sorted

//正序排序从小到大
Stream<Integer> sortedStream = Stream.of(5, 3, 1, 4, 2).sorted();
sortedStream.forEach(System.out::println);
//输出结果:12345//逆序排序从大到小,Comparator.reverseOrder() 创建了一个逆序比较器,然后传递给 sorted 方法,从而实现了逆序排序
Stream<Integer> sortedStream = Stream.of(5, 3, 1, 4, 2).sorted(Comparator.reverseOrder());
sortedStream.forEach(System.out::println);
//输出结果:54321

3.5 组合使用

这段代码首先去重,然后排序,跳过第一个元素,最后限制结果流只包含前三个元素

Stream<Integer> stream = Stream.of(1, 2, 2, 3, 4, 4, 5).distinct().sorted().skip(1).limit(3);
stream.forEach(System.out::println);
//输出结果:234

测试实体类:

@Data
public class Person {private int id;private String name; // 姓名private int salary; // 薪资private int age; // 年龄private String sex; //性别private String area; // 地区private List<Person> employeeList; //下属public Person() {}// 构造方法public Person(String name, int salary, int age,String sex,String area) {this.name = name;this.salary = salary;this.age = age;this.sex = sex;this.area = area;}// 构造方法public Person(int id, String name, int salary, int age, String sex, String area) {this.id = id;this.name = name;this.salary = salary;this.age = age;this.sex = sex;this.area = area;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", salary=" + salary +", age=" + age +", sex='" + sex + '\'' +", area='" + area + '\'' +'}';}
}
// 创建一个List来存储Person对象
List<Person> personList = new ArrayList<>();// 创建8个Person对象并添加到列表中
personList.add(new Person(1, "Alice", 5000, 30, "Female", "New York"));
personList.add(new Person(2, "Bob", 6000, 35, "Male", "Los Angeles"));
personList.add(new Person(3, "Charlie", 5500, 28, "Male", "Chicago"));
personList.add(new Person(4, "Diana", 7000, 40, "Female", "Miami"));
personList.add(new Person(5, "Ethan", 4800, 25, "Male", "Houston"));
personList.add(new Person(6, "Fiona", 5300, 32, "Female", "Seattle"));
personList.add(new Person(7, "George", 6200, 38, "Male", "Boston"));
personList.add(new Person(8, "Hannah", 5900, 29, "Female", "San Francisco"));

4 有状态的中间操作

4.1 filter(重要)

// 1. 筛选出所有女性
List<Person> females = personList.stream().filter(person -> person.getSex().equalsIgnoreCase("female")).collect(Collectors.toList());
System.out.println("女性列表: " + females);// 2. 筛选出薪资高于5000的人员
List<Person> highSalary = personList.stream().filter(person -> person.getSalary() > 5000).collect(Collectors.toList());
System.out.println("薪资高于5000的人员: " + highSalary);// 3. 筛选出年龄在30岁及以上的人员
List<Person> ageAbove30 = personList.stream().filter(person -> person.getAge() >= 30).collect(Collectors.toList());
System.out.println("年龄在30岁及以上的人员: " + ageAbove30);// 4. 筛选出居住在特定城市(例如"New York")的人员
List<Person> livingInNewYork = personList.stream().filter(person -> person.getArea().equalsIgnoreCase("New York")).collect(Collectors.toList());
System.out.println("居住在纽约的人员: " + livingInNewYork);// 5. 筛选出名字以"A"开头的人员
List<Person> namesStartingWithA = personList.stream().filter(person -> person.getName().startsWith("A")).collect(Collectors.toList());
System.out.println("名字以A开头的人员: " + namesStartingWithA);

4.2 map(重要)

// 1. 提取所有人的名字
List<String> names = personList.stream().map(Person::getName).collect(Collectors.toList());
System.out.println("所有人的名字: " + names);// 2. 提取所有人的薪资
List<Integer> salaries = personList.stream().map(Person::getSalary).collect(Collectors.toList());
System.out.println("所有人的薪资: " + salaries);// 3. 提取所有人的地区
List<String> cities = personList.stream().map(Person::getArea).collect(Collectors.toList());
System.out.println("所有人的城市: " + cities);// 4. 提取所有人的年龄,并加上10
List<Integer> agesPlus10 = personList.stream().map(person -> person.getAge() + 10).collect(Collectors.toList());
System.out.println("所有人的年龄加十: " + agesPlus10);// 5. 提取薪资信息并格式化为字符串
List<String> salaryInfo = personList.stream().map(person -> person.getName() + "的薪资为: " + person.getSalary()).collect(Collectors.toList());
System.out.println("薪资信息: " + salaryInfo);

4.3 flatMap

flatMap 是 Java Stream API 中的一个非常有用的方法,通常用于将多个流扁平化为一个流。在处理 Person 对象时,我们可以使用 flatMap 来进行一些复杂的数据结构操作。以下是一些示例,展示如何在你的 personList 上使用 flatMap。

List<String> flatMappedList = personList.stream().map(person -> person.getName()) // 将Person对象转换为名字.flatMap(name -> Stream.of(name, name.toUpperCase())) // 将名字转换为名字和名字的大写形式.collect(Collectors.toList());

4.4 peek

personList.stream().peek(person -> System.out.println("Before filter: " + person)) // 打印每个Person对象.filter(person -> person.getAge() > 30) // 过滤年龄大于30的Person对象.peek(person -> System.out.println("After filter: " + person)) // 打印过滤后的Person对象.collect(Collectors.toList());

4.5 组合使用

// 使用Stream API处理personList
List<String> combinedList = personList.stream().filter(person -> person.getAge() > 30) // 过滤年龄大于30的Person对象.map(person -> person.getName()) // 将Person对象转换为名字.flatMap(name -> Stream.of(name, name.toUpperCase())) // 将名字转换为名字和名字的大写形式.peek(System.out::println) // 打印每个名字.collect(Collectors.toList()); // 收集结果到一个List中

5 非短路的终端操作

5.1 forEach

personList.stream().forEach(person -> System.out.println(person.getName()));personList.stream().forEachOrdered(person -> System.out.println(person.getName()));

5.2 toArray

Object[] array = personList.stream().toArray();

5.3 reduce(重要)

// 1. 计算总薪资
int totalSalary = personList.stream().map(Person::getSalary).reduce(0, Integer::sum);
System.out.println("总薪资: " + totalSalary);// 2. 计算平均薪资
Optional<Double> averageSalary = personList.stream().map(Person::getSalary).reduce((a, b) -> a + b).map(sum -> sum / (double) personList.size());
System.out.println("平均薪资: " + averageSalary.orElse(0.0));// 3. 查找最高薪资
Optional<Integer> maxSalary = personList.stream().map(Person::getSalary).reduce(Integer::max);
System.out.println("最高薪资: " + maxSalary.orElse(0));// 4. 查找最低薪资
Optional<Integer> minSalary = personList.stream().map(Person::getSalary).reduce(Integer::min);
System.out.println("最低薪资: " + minSalary.orElse(0));// 5. 计算年龄之和
int totalAge = personList.stream().map(Person::getAge).reduce(0, Integer::sum);
System.out.println("总年龄: " + totalAge);

5.4 collect(重要)

//收集到 List集合
List<String> names = personList.stream().map(Person::getName).collect(Collectors.toList());
//收集到 Set集合
Set<String> cities = personList.stream().map(Person::getArea).collect(Collectors.toSet());
//收集到 Map集合
Map<Integer, String> idToNameMap = personList.stream().collect(Collectors.toMap(Person::getId, Person::getName));Map<Integer, Person> idToPersonMap = personList.stream().collect(Collectors.toMap(Person::getId, v -> v));
//收集到自定义集合
List<Person> sortedList = personList.stream().sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList());
//使用 Collectors.joining 连接字符串
String namesString = personList.stream().map(Person::getName).collect(Collectors.joining(", "));
//Collectors.groupingBy
Map<String, List<Person>> cityToPeopleMap = personList.stream().collect(Collectors.groupingBy(Person::getArea));
//使用 Collectors.partitioningBy 分区
Map<Boolean, List<Person>> isAdultMap = personList.stream().collect(Collectors.partitioningBy(person -> person.getAge() >= 18));
//使用 Collectors.summarizingInt 计算统计信息
IntSummaryStatistics salarySummary = personList.stream().collect(Collectors.summarizingInt(Person::getSalary));
double average = salarySummary.getAverage();//平均值
int max = salarySummary.getMax();//最大值
long count = salarySummary.getCount();//计数
int min = salarySummary.getMin();//最小值
long sum = salarySummary.getSum();//求和

5.5 min、max、count

Optional<Person> maxSalaryPerson = personList.stream().max(Comparator.comparing(Person::getSalary));
Optional<Person> minAgePerson = personList.stream().min(Comparator.comparing(Person::getAge));
long count = personList.stream().count();

5.6 组合使用

这段代码首先计算所有 Person 对象的工资总和,然后找到年龄最大的 Person 对象,最后将所有 Person 对象的名字收集到一个 List 中。

int totalSalary = personList.stream().mapToInt(Person::getSalary).reduce(0, Integer::sum);Optional<Person> oldestPerson = personList.stream().max(Comparator.comparing(Person::getAge));List<String> names = personList.stream().map(Person::getName).collect(Collectors.toList());

6 短路的终端操作

6.1 anyMatch

boolean hasFemale = personList.stream().anyMatch(person -> "Female".equals(person.getGender()));

6.2 allMatch

boolean allAdults = personList.stream().allMatch(person -> person.getAge() >= 18);

6.3 noneMatch

boolean noRetired = personList.stream().noneMatch(person -> person.getAge() >= 65);

6.4 findFirst

Optional<Person> firstPerson = personList.stream().findFirst();

6.5 findAny

Optional<Person> anyPerson = personList.stream().findAny();

6.6 组合使用

这段代码首先检查是否存在女性,然后找到第一个成年人,最后将所有成年人的名字收集到一个 List 中。

boolean hasFemale = personList.stream().anyMatch(person -> "Female".equals(person.getGender()));Optional<Person> firstAdult = personList.stream().filter(person -> person.getAge() >= 18).findFirst();List<String> names = personList.stream().filter(person -> person.getAge() >= 18).map(Person::getName).collect(Collectors.toList());

7 并行流

并行流可以提高处理大数据集时的性能。Java Stream API 的并行处理是基于 Java 的 Fork/Join 框架实现的。Fork/Join 框架是 Java 7 引入的一种并行计算框架,它可以将一个大任务拆分成多个小任务,然后在多个处理器上并行执行这些小任务,最后将结果合并。

在 Stream API 中,并行流是通过 parallelStream() 方法创建的。当你调用 parallelStream() 方法时,Stream API 会创建一个 ForkJoinTask,并将其提交给 ForkJoinPool 执行。ForkJoinPool 是一个特殊的线程池,它使用工作窃取算法来平衡任务执行,从而提高并行处理效率。

String allNames = personList.parallelStream().map(Person::getName).collect(Collectors.joining(", "));
System.out.println("All Names (Parallel): " + allNames);

8 总结

Stream API 的主要特点包括:

  1. 简洁性:Stream API 提供了一种简洁的方式来处理集合数据,使得代码更加易读、易写。
  2. 可读性:Stream API 的操作可以链式调用,使得代码更加清晰、易读。并行处理:Stream API 支持
  3. 并行处理,可以充分利用多核处理器的能力。
  4. 惰性求值:Stream API 的操作是惰性求值的,即只有在需要结果时才会执行操作。
  5. 无状态操作:Stream API 的无状态操作不会改变流中的元素,也不会改变流的状态。
  6. 有状态操作:Stream API 的有状态操作会改变流的状态,或者依赖于流中的其他元素。
  7. 短路操作:Stream API 的短路操作会在满足某个条件时提前结束处理,并返回一个结果。
  8. 终端操作:Stream API 的终端操作会处理流中的所有元素,并返回一个结果。

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

在这里插入图片描述

相关文章:

【Lambda】java之lambda表达式stream流式编程操作集合

java之lambda表达式&stream流式编程操作集合 1 stream流概念1.1 中间操作1.1.1 无状态操作1.1.2 有状态操作 1.2 终端操作1.2.1 非短路操作1.2.2 短路操作 2 steam流的生成2.1 方式一&#xff1a;数组转为stream流2.2 方式二&#xff1a;集合转为steam流2.3 方式三&#xf…...

家具购物小程序+php

基于微信小程序的家具购物小程序的设计与实现 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于微信小程序的家具购物小程序的设计与实现的开发全过程。通过分析基于微信小程序的家具购物小程序的设计与实…...

【GIS教程】使用GDAL-Python将tif转为COG并在ArcGIS Js前端加载-附完整代码

目录 一、数据格式 二、COG特点 三、使用GDAL生成COG格式的数据 四、使用ArcGIS Maps SDK for JavaScript加载COG格式数据 一、数据格式 COG&#xff08;Cloud optimized GeoTIFF&#xff09;是一种GeoTiff格式的数据。托管在 HTTP 文件服务器上&#xff0c;可以代替geose…...

VB.net进行CAD二次开发(二)与cad交互

开发过程遇到了一个问题&#xff1a;自制窗口与控件与CAD的交互。 启动类&#xff0c;调用非模式窗口 Imports Autodesk.AutoCAD.Runtime Public Class Class1 //CAD启动界面 <CommandMethod("US")> Public Sub UiStart() Dim myfrom As Form1 New…...

【NLP 11、Adam优化器】

祝你先于春天&#xff0c; 翻过此间铮铮山峦 —— 24.12.8 一、Adam优化器的基本概念 定义 Adam&#xff08;Adaptive Moment Estimation&#xff09;是一种基于梯度的优化算法&#xff0c;用于更新神经网络等机器学习模型中的参数。它结合了动量法&#xff08;Momentum&…...

51单片机应用开发(进阶)---串口接收字符命令

实现目标 1、巩固UART知识&#xff1b; 2、掌握串口接收字符数据&#xff1b; 3、具体实现目标&#xff1a;&#xff08;1&#xff09;上位机串口助手发送多字符命令&#xff0c;单片机接收命令作相应的处理&#xff08;如&#xff1a;openled1 即打开LED1;closeled1 即关…...

redis 怎么样删除list

在 Redis 中&#xff0c;可以使用以下方法删除列表或列表中的元素&#xff1a; 1. 删除整个列表 使用 DEL 命令删除一个列表键&#xff1a; DEL mylist这个命令会删除键 mylist 及其值&#xff08;无论 mylist 是一个列表还是其他类型的键&#xff09;。 2. 删除列表中的部分…...

【数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;实现快速排序算法。 测试说明 平台会对你编写的代码进行测试&#xff1a; 测试输入示例&#xff1a; 10 6 8 7 9 0 1 3 2 4 5 (说明&#xff1a;第一行是元素个数&a…...

npm或yarn包配置地址源

三种方法 1.配置.npmrc 文件 在更目录新增.npmrc文件 然后写入需要访问的包的地址 2.直接yarn.lock文件里面修改地址 简单粗暴 3.yarn install 的时候添加参数 设置包的仓库地址 yarn config set registry https://registry.yarnpkg.com 安装&#xff1a;yarn install 注意…...

STUN服务器用于内网NAT的方案

在内网中部署 STUN 服务器的场景通常用于处理多层 NAT 或内网客户端之间的通信需求&#xff0c;尤其是在大企业或学校等复杂网络环境下。通过 STUN 服务器&#xff0c;可以帮助客户端设备检测和适配 NAT 转换规则&#xff0c;进而支持 WebRTC 或其他实时通信技术的正常运行。 …...

Linux 简单命令总结

1. 简单命令 1.1. ls 列出该目录下的所有子目录与文件&#xff0c;后面还可以跟上一些选项 常用选项&#xff1a; ・-a 列出目录下的所有文件&#xff0c;包括以。开头的隐含文件。 ・-d 将目录象文件一样显示&#xff0c;而不是显示其下的文件。如&#xff1a;ls -d 指定目…...

Vue.js组件开发:提升你的前端工程能力

Vue.js 是一个用于构建用户界面的渐进式框架&#xff0c;它允许开发者通过组件化的方式创建可复用且易于管理的代码。在 Vue.js 中开发组件是一个直观且高效的过程&#xff0c;下面我将概述如何创建和使用 Vue 组件&#xff0c;并提供一些最佳实践。 1. 创建基本组件 首先&am…...

使用 Pandas 读取 JSON 数据的五种常见结构解析

文章目录 引言JSON 数据的五种常见结构1. split 结构2. records 结构3. index 结构4. columns 结构5. values 结构 引言 在日常生活中&#xff0c;我们经常与各种数据打交道&#xff0c;无论是从网上购物的订单信息到社交媒体上的动态更新。JSON&#xff08;JavaScript Object…...

C++鼠标轨迹算法(鼠标轨迹模拟真人移动)

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…...

Go mysql驱动源码分析

文章目录 前言注册驱动连接器创建连接交互协议读写数据读数据写数据 mysqlConncontext超时控制 查询发送查询请求读取查询响应 Exec发送exec请求读取响应 预编译客户端预编译服务端预编译生成prepareStmt执行查询操作执行Exec操作 事务读取响应query响应exec响应 总结 前言 go…...

GNSS误差源及差分定位

GNSS误差源&#xff1a; &#xff08;一&#xff09;卫星星历误差 由星历信息所得出的卫星位置坐标与实际位置坐标的偏差就是星历误差。星历信息是由 GPS 地面部分测量计算后传入空间部分的。由于卫星在运动中要受到各种摄动力的作用, 而地面部分又很难精确测量这些作用力,…...

pg数据类型

1、数值类型&#xff1a; smallint 2 字节 小范围整数 -32768 到 32767 integer 4 字节 常用的整数 -2147483648 到 2147483647 bigint 8 字节 大范围整数 -9223372036854775808 到 9223372036854775807 decimal 可变长 用户指定的精度&#x…...

【java】finalize方法

目录 1. 说明2. 调用过程3. 注意事项 1. 说明 1.finalize方法是Java中Object类的一个方法。2.finalize方法用于在对象被垃圾回收之前执行一些清理工作。3.当JVM&#xff08;Java虚拟机&#xff09;确定一个对象不再被引用、即将被回收时&#xff0c;会调用该对象的finalize方法…...

HNU_多传感器(专选)_作业4(构建单层感知器实现分类)

1. (论述题)&#xff08;共1题&#xff0c;100分&#xff09; 假设平面坐标系上有四个点&#xff0c;要求构建单层感知器实现分类。 (3,3),(4,3) 两个点的标签为1&#xff1b; (1,1),(0,2) 两个点的标签为-1。 思路&#xff1a;要分类的数据是2维数据&#xff0c;需要2个输入…...

以太网链路详情

文章目录 1、交换机1、常见的概念1、冲突域2、广播域3、以太网卡1、以太网卡帧 4、mac地址1、mac地址表示2、mac地址分类3、mac地址转换为二进制 2、交换机的工作原理1、mac地址表2、交换机三种数据帧处理行为3、为什么会泛洪4、转发5、丢弃 3、mac表怎么获得4、同网段数据通信…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...

boost::filesystem::path文件路径使用详解和示例

boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类&#xff0c;封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解&#xff0c;包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...

Linux入门(十五)安装java安装tomcat安装dotnet安装mysql

安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了&#xff0c;系统很多命…...

【动态规划】B4336 [中山市赛 2023] 永别|普及+

B4336 [中山市赛 2023] 永别 题目描述 你做了一个梦&#xff0c;梦里有一个字符串&#xff0c;这个字符串无论正着读还是倒着读都是一样的&#xff0c;例如&#xff1a; a b c b a \tt abcba abcba 就符合这个条件。 但是你醒来时不记得梦中的字符串是什么&#xff0c;只记得…...

【Redis】Redis 的持久化策略

目录 一、RDB 定期备份 1.2 触发方式 1.2.1 手动触发 1.2.2.1 自动触发 RDB 持久化机制的场景 1.2.2.2 检查是否触发 1.2.2.3 线上运维配置 1.3 检索工具 1.4 RDB 备份实现原理 1.5 禁用 RDB 快照 1.6 RDB 优缺点分析 二、AOF 实时备份 2.1 配置文件解析 2.2 开启…...

Linux 内核内存管理子系统全面解析与体系构建

一、前言: 为什么内存管理是核心知识 内存管理是 Linux 内核最核心也最复杂的子系统之一&#xff0c;其作用包括&#xff1a; 为软件提供独立的虚拟内存空间&#xff0c;实现安全隔离分配/回收物理内存资源&#xff0c;维持系统稳定支持不同类型的内存分配器&#xff0c;最优…...

低代码采购系统搭建:鲸采云+能源行业订单管理自动化案例

在能源行业数字化转型浪潮下&#xff0c;某大型能源集团通过鲸采云低代码平台&#xff0c;仅用3周时间就完成了采购订单管理系统的定制化搭建。本文将揭秘这一成功案例的实施路径与关键成效。 项目背景与挑战 该企业面临&#xff1a; 供应商分散&#xff1a;200供应商使用不同…...