实际中的Stream流的用法

实际中的Stream流的用法

不同对象怎么生成stream流对象

package stream;/*** @author 刘诗良* @version 1.0* @Description*/
import java.util.*;
import java.util.stream.Stream;public class StreamDemo {public static void main(String[] args) {//Collection体系的集合可以使用默认方法stream()生成流List<String> list = new ArrayList<>();Stream<String> listStream = list.stream();Set<String> set = new HashSet<>();Stream<String> setStream = set.stream();//Map体系的集合间接生成流Map<String,Integer> map = new HashMap<>();Stream<String> keyStream = map.keySet().stream();Stream<Integer> valueStream = map.values().stream();Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();//数组可以通过Stream接口的静态方法of(T...values)生成流String[] strArray = {"hello","world","java"};Stream<String> strArrayStream = Stream.of(strArray);Stream<String> strArrayStream2 = Stream.of("hello", "world", "java");Stream<Integer> intStream = Stream.of(10, 20, 30);}
}

image-20240221205424836

除了上面明显的方法调用对象是null外,不会出现异常。

forEach和map的不同

forEach会改变原集合(不管是否是引用)

package yimeng;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.*;public class StreamTest {public static void main(String[] args) {List<Person> userList = new ArrayList<>();userList.add(new Person("段誉",25));userList.add(new Person("萧峰",40));userList.add(new Person("虚竹",30));userList.add(new Person("无涯子",100));userList.add(new Person("慕容复",35));userList.add(new Person("云中鹤",45));System.out.println("-------原集合--------");System.out.println(userList);System.out.println("-------修改引用类型--------");userList.stream().forEach(u -> {u.setName("天龙八部-" + u.getName());});System.out.println(userList);System.out.println("-------修改非引用类型--------");userList.stream().forEach(u -> {u.setAge(12);});System.out.println(userList);}
}@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class Person {private String name;private int age;
}

image-20240223231616072

不管修改引用类型还是非引用类型的数据,都会影响原来集合。

除了上面明显的方法调用对象是null外,不会出现异常。forEach方法中u.setName(“天龙八部-” + u.getName());、u.setAge(12);的u为null会出现异常。

map不会改变原集合(不管是否是引用)

package yimeng;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.*;public class StreamTest {public static void main(String[] args) {List<Person> userList = new ArrayList<>();userList.add(new Person("段誉",25));userList.add(new Person("萧峰",40));userList.add(new Person("虚竹",30));userList.add(new Person("无涯子",100));userList.add(new Person("慕容复",35));userList.add(new Person("云中鹤",45));System.out.println("-------原集合--------");System.out.println(userList);System.out.println("-------修改引用类型--------");userList.stream().map(u -> {u.setName("天龙八部-" + u.getName());return 1234;});System.out.println(userList);System.out.println("-------修改非引用类型--------");userList.stream().map(u -> {u.setAge(12);return "测试";});System.out.println(userList);}
}@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class Person {private String name;private int age;
}

image-20240223233133701

除了上面明显的方法调用对象是null外,不会出现异常。forEach方法中u.setName(“天龙八部-” + u.getName());、u.setAge(12);的u为null会出现异常。

map必须要有返回值,但是forEach不用

看到下面这个map这样写是错的。

image-20240223232739988

map方法返回的还是一个流,map参数的方法要有返回值,forEach没有返回值,且是终结流,且它的参数的方法没有返回值

image-20240223233351856

注意:

下面这种,你把变量指向一个新的引用对象,是不会改变原来集合的。因为,下面的forEach相当于是把流中指向userList正在遍历的元素的引用赋值给了forEach中定义的变量,然后去执行操作的。所以上面的forEach案例你操作u.setAge()能改变原来集合,其实就是因为你u指向了真正的对象,所以u.setAge()就是让真正的对象去改变值,所以能改变原来集合。至于下面这种为什么不行,就是因为原来u是指向正在遍历的对象的,但是你u=new Person(“1”,1);就是把u指向另一个对象,所以执行就不会改变原来集合中的元素。

package yimeng;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.*;
import java.util.stream.Collectors;public class StreamTest {public static void main(String[] args) {List<Person> userList = new ArrayList<>();userList.add(new Person("段誉",25));userList.add(new Person("萧峰",40));userList.add(new Person("虚竹",30));userList.add(new Person("无涯子",100));userList.add(new Person("慕容复",35));userList.add(new Person("云中鹤",45));userList.stream().forEach(u -> {u=new Person("1",1);u.setAge(111);});System.out.println(userList);}
}@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class Person {private String name;private int age;
}

image-20240223234902755

去null

package yimeng;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;public class StreamTest {public static void main(String[] args) {List<UserInfo> list=new ArrayList<>();list.add(UserInfo.builder().userId(1L).userName("张三").build());list.add(UserInfo.builder().userId(2L).amount(10).userName("李四").build());list.add(UserInfo.builder().userId(3L).amount(15).build());List<String> userNameList = list.stream().map(UserInfo::getUserName).filter(Objects::nonNull).collect(Collectors.toList());System.out.println(userNameList);}
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class UserInfo {private Long userId;private String userName;private String status;private Integer amount;private Date createDate;
}

image-20240219215141924

但是这种方式不能去空字符串。

比如:

image-20240219215646681

解决:

image-20240219215823723

注意:上面的map方法调用前流中的元素如果是null,那么执行UserInfo::getUserName会出现空指针异常。

image-20240228213606914

解决:

image-20240228213737100

处理后返回一个新的List

package yimeng;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.ObjectUtils;import java.util.*;
import java.util.stream.Collectors;public class StreamTest {public static void main(String[] args) {List<UserInfo> list=new ArrayList<>();list.add(UserInfo.builder().userId(1L).userName("张三").build());list.add(UserInfo.builder().userId(2L).amount(10).userName("李四").build());list.add(UserInfo.builder().userId(3L).amount(15).build());// List<String>转List<Long>List<Long> toLong = Arrays.asList("1","2").stream().map(Long::parseLong).collect(Collectors.toList());System.out.println(toLong);// List<Bean>转类型List<String>,其中新list的元素为老list中每一个元素的用户名。List<String> userNameList = list.stream().map(UserInfo::getUserName).collect(Collectors.toList());System.out.println(userNameList);}
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class UserInfo {private Long userId;private String userName;private String status;private Integer amount;private Date createDate;
}

image-20240219220345064

返回一个新的List,要求没有null

package yimeng;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.ObjectUtils;import java.util.*;
import java.util.stream.Collectors;public class StreamTest {public static void main(String[] args) {List<UserInfo> list=new ArrayList<>();list.add(UserInfo.builder().userId(1L).userName("张三").build());list.add(UserInfo.builder().userId(2L).amount(10).userName("李四").build());list.add(UserInfo.builder().userId(3L).userName("王五").build());list.add(UserInfo.builder().userId(4L).amount(15).build());list.add(UserInfo.builder().userId(5L).amount(25).userName("").build());list.add(UserInfo.builder().userId(6L).amount(45).userName("  ").build());// List<Bean>转类型List<String>,其中新list的元素为老list中每一个元素的用户名。排除空。List<Integer> amountList1 = list.stream().map(i -> i.getAmount() == null ? 0 : i.getAmount()).collect(Collectors.toList());System.out.println(amountList1);}
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class UserInfo {private Long userId;private String userName;private String status;private Integer amount;private Date createDate;
}

image-20240219220815060

去除重复

distinct()方法的判断重复和HashMap判断重复的做法是一样的。是通过hashCode()方法和equals()方法来判断是否重复的(java中有约定,重写equals()方法就得重写hashCode(),并且约定重写的规则是hashCode()判定相同,equals()方法可以判定为不同。equals判定为相同,hashCode()得要判定为相同,当然你不遵循约定也是OK的)。distinct()判定如果重复了,那么只会留下先遍历到的那个元素,后面遍历到的被判定为重复的元素,而被舍弃。判断重复的规则是:通过“正在遍历的元素”.equals(“加入到新集合中的每一个元素”)来判断是否重复,只要存在返回true,那么就判定为重复,判断为重复那么正在遍历的元素就不会被加入到新集合。如果都不返回true,就判断为不重复,那么就会把正在遍历的元素加入到新集合中去

测试只有equals()判断重复,是不是被认定为重复:

package yimeng;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.*;
import java.util.stream.Collectors;public class StreamTest {public static void main(String[] args) {List<UserInfo> list=new ArrayList<>();list.add(UserInfo.builder().userId(1L).userName("张三").build());list.add(UserInfo.builder().userId(2L).amount(10).userName("李四").build());list.add(UserInfo.builder().userId(3L).userName("王五").build());list.add(UserInfo.builder().userId(4L).amount(15).build());list.add(UserInfo.builder().userId(5L).amount(15).userName("").build());list.add(UserInfo.builder().userId(6L).amount(45).userName("  ").build());// 没有去重复List<UserInfo> amountList = list.stream().collect(Collectors.toList());System.out.println("没有去重:"+amountList);// 去重复List<UserInfo> amountList1 = list.stream().distinct().collect(Collectors.toList());System.out.println("去重:"+amountList1);}
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class UserInfo {private Long userId;private String userName;private String status;private Integer amount;private Date createDate;@Overridepublic boolean equals(Object o) {// 一定返回truereturn true;}@Overridepublic int hashCode() {Random random = new Random();int randomNumber = random.nextInt();System.out.println(randomNumber);// 不会重复return randomNumber;}
}

结果(没有被判断为重复):

image-20240219222940786

两个方法都判断为重复,才会被认定为重复。并且只会留下第一个元素,后面被判断为重复的元素不会被留下:

package yimeng;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.*;
import java.util.stream.Collectors;public class StreamTest {public static void main(String[] args) {List<UserInfo> list=new ArrayList<>();list.add(UserInfo.builder().userId(1L).userName("张三").build());list.add(UserInfo.builder().userId(2L).amount(10).userName("李四").build());list.add(UserInfo.builder().userId(3L).userName("王五").build());list.add(UserInfo.builder().userId(4L).amount(15).build());list.add(UserInfo.builder().userId(5L).amount(15).userName("").build());list.add(UserInfo.builder().userId(6L).amount(45).userName("  ").build());// 没有去重复List<UserInfo> amountList = list.stream().collect(Collectors.toList());System.out.println("没有去重:"+amountList);// 去重复List<UserInfo> amountList1 = list.stream().distinct().collect(Collectors.toList());System.out.println("去重:"+amountList1);}
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class UserInfo {private Long userId;private String userName;private String status;private Integer amount;private Date createDate;@Overridepublic boolean equals(Object o) {// 一定返回truereturn true;}@Overridepublic int hashCode() {// 重复return 10;}
}

image-20240219223111178

判断重复的规则(通过“正在遍历的元素”.equals(“加入到新集合中的每一个元素”)来判断是否重复,只要存在返回true,那么就判定为重复,判断为重复那么正在遍历的元素就不会被加入到新集合。如果都不返回true,就判断为不重复,那么就会把正在遍历的元素加入到新集合中去):

package yimeng;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.*;
import java.util.stream.Collectors;public class StreamTest {public static void main(String[] args) {List<UserInfo> list=new ArrayList<>();list.add(UserInfo.builder().userId(1L).userName("张三").build());list.add(UserInfo.builder().userId(2L).amount(10).userName("李四").build());list.add(UserInfo.builder().userId(3L).userName("王五").build());list.add(UserInfo.builder().userId(2L).amount(15).build());list.add(UserInfo.builder().userId(3L).amount(15).userName("").build());list.add(UserInfo.builder().userId(6L).amount(45).userName("  ").build());// 没有去重复List<UserInfo> amountList = list.stream().collect(Collectors.toList());System.out.println("没有去重:"+amountList);// 去重复List<UserInfo> amountList1 = list.stream().distinct().collect(Collectors.toList());System.out.println("去重:"+amountList1);}
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class UserInfo {private Long userId;private String userName;private String status;private Integer amount;private Date createDate;@Overridepublic boolean equals(Object o) {// “正在遍历的元素”.equals(“每一个元素”)来判断是否重复,只要有一个返回true就表示存在重复。所以,运行结果是除了userId为1的那个张三外,都会被判定为存在重复,又因为重复的话,后面的元素会被舍弃,那么结果就只有userId为1的元素。因为上面所有元素的userId中,没有userId比1小的,所以只有“张三”那个元素对比每一个元素时,“this.userId>((UserInfo)o).getUserId()”都为false。return this.userId>((UserInfo)o).getUserId();}@Overridepublic int hashCode() {// 重复return 10;}
}

image-20240220225715557

package yimeng;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.*;
import java.util.stream.Collectors;public class StreamTest {public static void main(String[] args) {List<UserInfo> list=new ArrayList<>();list.add(UserInfo.builder().userId(2L).amount(10).userName("李四").build());list.add(UserInfo.builder().userId(3L).userName("王五").build());list.add(UserInfo.builder().userId(2L).amount(15).build());list.add(UserInfo.builder().userId(1L).userName("张三").build());list.add(UserInfo.builder().userId(3L).amount(15).userName("").build());list.add(UserInfo.builder().userId(6L).amount(45).userName("  ").build());// 没有去重复List<UserInfo> amountList = list.stream().collect(Collectors.toList());System.out.println("没有去重:"+amountList);// 去重复List<UserInfo> amountList1 = list.stream().distinct().collect(Collectors.toList());System.out.println("去重:"+amountList1);}
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class UserInfo {private Long userId;private String userName;private String status;private Integer amount;private Date createDate;@Overridepublic boolean equals(Object o) {// “正在遍历的元素”.equals(“每一个元素”)来判断是否重复,只要有一个返回true就表示存在重复。所以,运行结果是除了userId为1的那个张三外,都会被判定为存在重复,又因为重复的话,后面的元素会被舍弃,那么结果就只有userId为1的元素。因为上面所有元素的userId中,没有userId比1小的,所以只有“张三”那个元素对比每一个元素时,“this.userId>((UserInfo)o).getUserId()”都为false。return this.userId>((UserInfo)o).getUserId();}@Overridepublic int hashCode() {// 重复return 10;}
}

image-20240220232742778

转为Map

package yimeng;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.*;
import java.util.stream.Collectors;public class StreamTest {public static void main(String[] args) {List<UserInfo> list=new ArrayList<>();list.add(UserInfo.builder().userId(1L).userName("张三").build());list.add(UserInfo.builder().userId(2L).amount(10).userName("李四").build());list.add(UserInfo.builder().userId(3L).userName("王五").build());list.add(UserInfo.builder().userId(4L).amount(15).build());list.add(UserInfo.builder().userId(5L).amount(15).userName("").build());list.add(UserInfo.builder().userId(6L).amount(45).userName("  ").build());Map<Long, UserInfo> map1 = list.stream().collect(Collectors.toMap(UserInfo::getUserId, i -> i));System.out.println(map1);}
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class UserInfo {private Long userId;private String userName;private String status;private Integer amount;private Date createDate;
}

image-20240219223350277

但是,如果键有重复,那么会出现异常。

image-20240219223450627

解决:

package yimeng;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.*;
import java.util.stream.Collectors;public class StreamTest {public static void main(String[] args) {List<UserInfo> list=new ArrayList<>();list.add(UserInfo.builder().userId(1L).userName("张三").build());list.add(UserInfo.builder().userId(2L).amount(10).userName("李四").build());list.add(UserInfo.builder().userId(3L).userName("王五").build());list.add(UserInfo.builder().userId(3L).amount(15).build());list.add(UserInfo.builder().userId(5L).amount(15).userName("1").build());list.add(UserInfo.builder().userId(6L).amount(45).userName("jdlf").build());Map<Long, String> map = list.stream().collect(Collectors.toMap(UserInfo::getUserId, i -> i.getUserName() == null ? "null" : i.getUserName(), (k1, k2) -> k2));System.out.println(map);}
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class UserInfo {private Long userId;private String userName;private String status;private Integer amount;private Date createDate;
}

image-20240219223915598

取符合条件的一个元素

使用limit

package yimeng;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.*;
import java.util.stream.Collectors;public class StreamTest {public static void main(String[] args) {List<UserInfo> list=new ArrayList<>();list.add(UserInfo.builder().userId(1L).userName("张三").build());list.add(UserInfo.builder().userId(2L).amount(10).userName("李四").build());list.add(UserInfo.builder().userId(3L).userName("王五").build());list.add(UserInfo.builder().userId(3L).amount(15).build());list.add(UserInfo.builder().userId(5L).amount(15).userName("1").build());list.add(UserInfo.builder().userId(6L).amount(45).userName("张三").build());List<UserInfo> collect = list.stream().filter(u -> "张三".equals(u.getUserName())).limit(1).collect(Collectors.toList());System.out.println(collect.get(0));List<UserInfo> collect1 = list.stream().filter(u -> "张三111".equals(u.getUserName())).limit(1).collect(Collectors.toList());System.out.println(collect1.get(0));}
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class UserInfo {private Long userId;private String userName;private String status;private Integer amount;private Date createDate;
}

image-20240219232002715

使用findAny或者findFirst(找符合条件的元素可以用这个两个方法)

并行流时findAny的效率会比findFirst高一些,串行流的话两者效率一样,并且在并行流的情景下,我们一般是不会有需求知道哪一个元素是第一个被放到新集合去的,因为都用并行流了,说明不在意结果的集合中的元素的顺序了,所以并行流里一般也不会使用findFirst方法,所以,建议使用findAny

package yimeng;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.*;
import java.util.stream.Collectors;public class StreamTest {public static void main(String[] args) {List<UserInfo> list=new ArrayList<>();list.add(UserInfo.builder().userId(1L).userName("张三").build());list.add(UserInfo.builder().userId(2L).amount(10).userName("李四").build());list.add(UserInfo.builder().userId(3L).userName("王五").build());list.add(UserInfo.builder().userId(3L).amount(15).build());list.add(UserInfo.builder().userId(5L).amount(15).userName("1").build());list.add(UserInfo.builder().userId(6L).amount(45).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/512242.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springBoot-SpringBoot自定义starter

在一个空Maven项目中&#xff0c;新增xxxx-spring-boot-starter和xxxx-spring-boot-autoconfigure两个模块&#xff0c;xxxx是你这个starter是做什么的&#xff0c;模块xxxx-spring-boot-starter主要是作依赖管理&#xff0c;外界使用我们自定义的starter只需要导入我们xxxx-sp…

记 Hyperf booted模型事件的使用

前因 产品经理提了一个需求&#xff0c;要求能自定义内容的创建时间&#xff0c;当前事件大于创建时间时&#xff0c;才能查询到这些内容&#xff0c;并对内容进行操作 我的第一反应&#xff1a;不算麻烦&#xff0c;只需要在仓储层的查询方法中&#xff0c;给每个查询都多加…

Golang Copy()方法学习

前言 主要是涉及到深浅拷贝相关的&#xff0c;但是在看的一个资料过程中发现他有错…并且一系列&#xff0c;复制粘贴他的&#xff0c;也都错了。 错误文章指路 很显然&#xff0c;Copy是深拷贝啊&#xff01;&#xff01;&#xff01; Copy功能 copy的代码很少&#xff0c…

9.WEB渗透测试-Linux基础知识-Linux用户权限管理(上)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;8.WEB渗透测试-Linux基础知识-Linux基础操作&#xff08;二&#xff09;-CSDN博客 用户管…

如何在jupyter notebook 中下载第三方库

在anconda 中找到&#xff1a; Anaconda Prompt 进入页面后的样式&#xff1a; 在黑色框中输入&#xff1a; 下载第三方库的命令 第三方库&#xff1a; 三种输入方式 标准保证正确 pip instsall 包名 -i 镜像源地址 pip install pip 是 Python 包管理工具&#xff0c;…

【笔记】【电子科大 离散数学】 3.谓词逻辑

谓词引入 因为含变量的语句&#xff08;例如x > 3&#xff09;不是命题&#xff0c;无法进行逻辑推理。 为了研究简单命题句子内部的逻辑关系&#xff0c;我们需要对简单命题进行分解&#xff0c;利用个体词&#xff0c;谓词和量词来描述它们&#xff0c;并研究个体与总体…

非阻塞实现高效键盘扫描功能(STM32F4XX)

目录 概述 1 原理分析 1.1 技术背景 1.2 系统硬件 1.3 STM32 IO&#xff08;输入模式&#xff09;寄存器分析 1.3.1 输入IO的功能描述 1.3.2 输入配置 1.3.3 GPIO 寄存器&#xff08;输入模式相关&#xff09; 1.3.3.1 GPIO 端口模式寄存器 1.3.3.2 GPIO 端口上拉/下拉…

通过联合部署DDoS高防和WAF提升网站防护能力

如果您的网站遭受的攻击既有流量型攻击&#xff0c;又混杂精巧的Web应用层攻击时&#xff08;例如SQL注入、跨站脚本攻击、命令注入等&#xff09;时&#xff0c;推荐您组合使用阿里云DDoS高防和Web 应用防火墙 WAF&#xff08;Web Application Firewall&#xff09;&#xff0…

NumpyPython 笔记2 3.5

如果不是矩阵的话&#xff0c;也可以用索引 矩阵也可以 np.vstack 上下合并两个数组 np.hstack 左右合并两个数组 没看懂 np.array 可以合并三个 np.concatenate 可以在后面axis定制是在行还是列上进行合并 np.split(A,2,axis1):对哪个东西&#xff0c;分成多少块&#…

Linux安全加固功能

提示:工具下载链接在文章最后 目录 一.加固功能介绍二.配置加固功能1.配置安全加固功能1.1 开放目前设备监听的所有端口1.2 只开放80、443、20、21、22端口1.3 防火墙配置工具1.3.1 开放允许访问的端口1.3.2 删除允许访问的端口1.3.3 添加IP地址允许访问规则1.3.4 添加IP地址禁…

数据库设计革命:逻辑模型的演变与面向对象的突破

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

Typescript的联合类型和交叉类型

联合类型 在 TypeScript 中&#xff0c;可以使用联合类型来定义对象接口&#xff0c;从而表示一个对象可以具有多种不同结构的类型。联合类型是或的关系!!! interface Circle {kind: "circle";radius: number; }interface Square {kind: "square";sideLe…