java8新特性【2023】
Lambda表达式
新的一套语法规则
是一个匿名函数
@Testpublic void test1(){Runnable r1 = new Runnable(){@Overridepublic void run() {System.out.println("线程A");}};r1.run();System.out.println("====================");Runnable r2 = () -> System.out.println("线程B");r2.run();}

public void test2(){//比大小Comparator<Integer> com1 = new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return Integer.compare(o1,o2);}};int i = com1.compare(15, 12);System.out.println(i);System.out.println("=======================");//比大小//函数式接口只有一个方法,就无需知道具体是哪个方法Comparator<Integer> com2 = (o1,o2) ->Integer.compare(o1,o2);int ii = com1.compare(15, 19);System.out.println(ii);}

方法引用
//比大小//函数式接口只有一个方法,就无需知道具体是哪个方法System.out.println("=======================");Comparator<Integer> com3 = Integer::compare;int iii = com1.compare(15, 15);System.out.println(iii);

格式【Lambda表达式的使用】分为8种
本质:作为接口的一个实例
public class LambdaTest1 {//11111无参无返回值的@Testpublic void test1(){Runnable r1 = new Runnable(){@Overridepublic void run() {System.out.println("线程A");}};r1.run();System.out.println("====================");Runnable r2 = () -> System.out.println("线程B");r2.run();}@Testpublic void test2() {//222222222222一个参数,但没有返回值Consumer<String> con = new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}};con.accept("消费者");System.out.println("========================");//lambda的写法Consumer<String> conn = (String s) ->System.out.println(s);conn.accept("消费者11");}//33333333333数据类型可以省略,因为可以由编译器推断出来,称为"类型推断"@Testpublic void test3() {System.out.println("========================");//lambda的写法Consumer<String> conn1 = (s) ->System.out.println(s);conn1.accept("消费者22");}//444444444444444444若只需要一个参数时,参数的小括号可以省略@Testpublic void test4() {System.out.println("========================");//lambda的写法Consumer<String> conn1 = s ->System.out.println(s);conn1.accept("消费者33");}//555555555555555555555两个或以上的参数,多条执行行语句,并且可以有返回值@Testpublic void test5() {//lambda的写法//比大小Comparator<Integer> com1 = new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return Integer.compare(o1,o2);}};System.out.println("===========================");//比大小Comparator<Integer> com2 = new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {System.out.println(o1);System.out.println(o2);return o1.compareTo(o2);}}; //比大小//66666666666System.out.println(com2.compare(15, 16));Comparator<Integer> com3 = (o1,o2) ->{System.out.println(o1);System.out.println(o2);return o1.compareTo(o2);};System.out.println(com3.compare(18, 12));}//7lambda只有一条语句,{}可以省略
}

函数式接口
只声明了一个抽样方法,则此接口就称为函数式接口
java四大核心函数式接口
Consumer<T>:不返
Supplier<T>:不给也返
Function<T,R>R apply(T t)
Predicate<T>:boolean test(T t)
方法引用与构造器引用
StreamAPI
对内存层面的多个数据,实现过滤,排序
可以对集合的数据进行操作,类似于sql执行的数据库查询
Stream操作三个步骤:创建----中间操作-------终止操作
创建:一个数据【如集合、数组】,获取一个流
中间操作:一个中间操作链,对数据源的数据进行处理
终止操作:一旦执行终止操作,就会执行中间操作链,并产生结果,之后不会被使用
创建Stream的方式
通过集合:
通过数组:
排序
自然排序:
List<Integer> list = Arrays.asList(12, 43, 65, 34, 87, 0, -98, 7);list.stream().sorted().forEach(System.out::println);
定制排序:
List<Employee> employees = EmployeeData.getEmployees();employees.stream().sorted((e1, e2) -> {int ageValue = Integer.compare(e1.getAge(), e2.getAge());if (ageValue != 0) {return ageValue;} else {// 年龄相同,按工资从小到大排序return Double.compare(e1.getSalary(), e2.getSalary());// 年龄相同,按工资从大到小排序// return -Double.compare(e1.getSalary(), e2.getSalary());}}).forEach(System.out::println);
创建无限流
Stream.iterate(0, t -> t + 2).limit(10).forEach(System.out::println);
Stream.generate(Math::random).limit(10).forEach(System.out::println);
筛选与切片
筛选
Stream<Employee> stream = list.stream();// 练习:查询员工表中薪资大于 7000 的员工信息stream.filter(e -> e.getSalary() > 7000).forEach(System.out::println);
// 1-筛选与切片@Testpublic void test5() {List<Employee> list = EmployeeData.getEmployees();// filter(Predicate p)-接收 Lambda,从流中排除某些元素。Stream<Employee> stream = list.stream();// 练习:查询员工表中薪资大于 7000 的员工信息stream.filter(e -> e.getSalary() > 7000).forEach(System.out::println);// Employee{id=1002, name='马云', age=12, salary=9876.12}// Employee{id=1004, name='雷军', age=26, salary=7657.37}// Employee{id=1006, name='比尔盖茨', age=42, salary=9500.43}System.out.println();// limit(n)-截断流,使其元素不超过给定数量。// stream.limit(3).forEach(System.out::println);//closed已经关闭,需要重新生成list.stream().limit(3).forEach(System.out::println);// Employee{id=1001, name='马化腾', age=34, salary=6000.38}// Employee{id=1002, name='马云', age=12, salary=9876.12}// Employee{id=1003, name='刘强东', age=33, salary=3000.82}System.out.println();// skip(n)-跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则list.stream().skip(3).forEach(System.out::println);// Employee{id=1004, name='雷军', age=26, salary=7657.37}// Employee{id=1005, name='李彦宏', age=65, salary=5555.32}// Employee{id=1006, name='比尔盖茨', age=42, salary=9500.43}// Employee{id=1007, name='任正非', age=26, salary=4333.32}// Employee{id=1008, name='扎克伯格', age=35, salary=2500.32}System.out.println();// distinct()-筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素list.add(new Employee(1010, "刘强东", 40, 8000));list.add(new Employee(1010, "刘强东", 42, 8000));list.add(new Employee(1010, "刘强东", 40, 8000));list.add(new Employee(1010, "刘强东", 40, 8000));list.add(new Employee(1010, "刘强东", 40, 8000));// System.out.println(list);// [Employee{id=1001, name='马化腾', age=34, salary=6000.38}, Employee{id=1002, name='马云', age=12, salary=9876.12},// Employee{id=1003, name='刘强东', age=33, salary=3000.82}, Employee{id=1004, name='雷军', age=26, salary=7657.37},// Employee{id=1005, name='李彦宏', age=65, salary=5555.32}, Employee{id=1006, name='比尔盖茨', age=42,// salary=9500.43}, Employee{id=1007, name='任正非', age=26, salary=4333.32}, Employee{id=1008, name='扎克伯格',// age=35, salary=2500.32}, Employee{id=1010, name='刘强东', age=40, salary=8000.0}, Employee{id=1010, name='刘强东',// age=42, salary=8000.0}, Employee{id=1010, name='刘强东', age=40, salary=8000.0}, Employee{id=1010, name='刘强东',// age=40, salary=8000.0}, Employee{id=1010, name='刘强东', age=40, salary=8000.0}]System.out.println("=================");list.stream().distinct().forEach(System.out::println);// Employee{id=1001, name='马化腾', age=34, salary=6000.38}// Employee{id=1002, name='马云', age=12, salary=9876.12}// Employee{id=1003, name='刘强东', age=33, salary=3000.82}// Employee{id=1004, name='雷军', age=26, salary=7657.37}// Employee{id=1005, name='李彦宏', age=65, salary=5555.32}// Employee{id=1006, name='比尔盖茨', age=42, salary=9500.43}// Employee{id=1007, name='任正非', age=26, salary=4333.32}// Employee{id=1008, name='扎克伯格', age=35, salary=2500.32}// Employee{id=1010, name='刘强东', age=40, salary=8000.0}// Employee{id=1010, name='刘强东', age=42, salary=8000.0}}
去重
list.stream().distinct().forEach(System.out::println);
映射
小写变大写
List<String> list = Arrays.asList("aa", "bb", "cc", "dd");list.stream().map(str -> str.toUpperCase()).forEach(System.out::println);
Stream终止操作
输出结果forEach(System.out::println);
Stream的终止操作:匹配与查询
匹配所有
@Testpublic void test9(){List<Employee> employees = EmployeeData.getEmployees();boolean allMatch = employees.stream().allMatch(e->e.getAge()>18);System.out.println(allMatch);}

有一个匹配就可以
List<Employee> employees1 = EmployeeData.getEmployees();boolean allMatch1 = employees1.stream().anyMatch(e->e.getAge()>18);System.out.println(allMatch1);

求个数
最大值
最小值
并行流
把一个内容分成多个数据模块,并用不同的线程分别处理每个数据块的流,相比较串行流,并行流可以很大层度上提高程序的执行效率
Optional类
最大化的减少空指针异常
新的时间日期API
其他特性
学习过程全部操作
public class LambdaTest2 {// 创建 Stream 方式一:通过集合@Testpublic void test1() {List<Employee> employees = EmployeeData.getEmployees();// default Stream<E> stream():返回一个顺序流Stream<Employee> stream = employees.stream();// default Stream<E> parallelStream():返回一个并行流Stream<Employee> parallelStream = employees.parallelStream();}// 创建 Stream 方式二:通过数组@Testpublic void test2() {int[] arr = new int[] {1, 2, 3, 4, 5, 6};// 调用 Arrays 类的 static <T> Stream<T> stream(T[] array): 返回一个流IntStream stream = Arrays.stream(arr);Employee e1 = new Employee(1001, "Tom");Employee e2 = new Employee(1002, "Jerry");Employee[] arr1 = new Employee[] {e1, e2};Stream<Employee> stream1 = Arrays.stream(arr1);}// 创建 Stream 方式三:通过 Stream 的 of()@Testpublic void test3() {Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);}// 创建 Stream 方式四:创建无限流@Testpublic void test4() {// 迭代// public static<T> Stream<T> iterate(final T seed,final UnaryOperator<T> f)// 遍历前 10 个偶数Stream.iterate(0, t -> t + 2).limit(10).forEach(System.out::println);// 生成// public static<T> Stream<T> generate(Supplier<T> s)Stream.generate(Math::random).limit(10).forEach(System.out::println);}// 1-筛选与切片@Testpublic void test5() {List<Employee> list = EmployeeData.getEmployees();// filter(Predicate p)-接收 Lambda,从流中排除某些元素。Stream<Employee> stream = list.stream();// 练习:查询员工表中薪资大于 7000 的员工信息stream.filter(e -> e.getSalary() > 7000).forEach(System.out::println);// Employee{id=1002, name='马云', age=12, salary=9876.12}// Employee{id=1004, name='雷军', age=26, salary=7657.37}// Employee{id=1006, name='比尔盖茨', age=42, salary=9500.43}System.out.println("1");// limit(n)-截断流,使其元素不超过给定数量。// stream.limit(3).forEach(System.out::println);//closed已经关闭,需要重新生成list.stream().limit(3).forEach(System.out::println);System.out.println("/2");// skip(n)-跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则list.stream().skip(3).forEach(System.out::println);System.out.println();// distinct()-筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素list.add(new Employee(1010, "刘强东", 40, 8000));list.add(new Employee(1010, "刘强东", 42, 8000));list.add(new Employee(1010, "刘强东", 40, 8000));list.add(new Employee(1010, "刘强东", 40, 8000));list.add(new Employee(1010, "刘强东", 40, 8000));System.out.println("=================");list.stream().distinct().forEach(System.out::println);}// 映射@Testpublic void test6() {// map(Function f)-接收一个函数作为参数,将元素转换成其他形式或提取信息,该函数会被应用到每个元素上,并将其映射成一个新的元素。List<String> list = Arrays.asList("aa", "bb", "cc", "dd");list.stream().map(str -> str.toUpperCase()).forEach(System.out::println);System.out.println("===--=-=-==0-");// 练习1:获取员工姓名长度大于 3 的员工的姓名。List<Employee> employees = EmployeeData.getEmployees();Stream<String> namesStream = employees.stream().map(Employee::getName);namesStream.filter(name -> name.length() > 3).forEach(System.out::println);System.out.println();// 练习2:Stream<Stream<Character>> streamStream = list.stream().map(LambdaTest2::fromStringToStream);streamStream.forEach(s -> {s.forEach(System.out::println);});System.out.println();// 集合里面套集合的方式,遍历优先使用 flatMap 方式// flatMap(Function f)-接受一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。Stream<Character> characterStream = list.stream().flatMap(LambdaTest2::fromStringToStream);characterStream.forEach(System.out::println);// a// a// b// b// c// c// d// d}// 将字符串中的多个字符构成的集合转换为对应的 Stream 的实例public static Stream<Character> fromStringToStream(String str) {// aArrayList<Character> list = new ArrayList<>();for (Character c : str.toCharArray()) {list.add(c);}return list.stream();}@Testpublic void test7() {ArrayList list1 = new ArrayList();list1.add(1);list1.add(2);list1.add(3);ArrayList list2 = new ArrayList();list2.add(4);list2.add(5);list2.add(6);list1.addAll(list2);System.out.println(list1);}// 3-排序@Testpublic void test8() {// sorted()-自然排序List<Integer> list = Arrays.asList(12, 43, 65, 34, 87, 0, -98, 7);list.stream().sorted().forEach(System.out::println);List<Employee> employees = EmployeeData.getEmployees();employees.stream().sorted((e1, e2) -> {int ageValue = Integer.compare(e1.getAge(), e2.getAge());if (ageValue != 0) {return ageValue;} else {// 年龄相同,按工资从小到大排序return Double.compare(e1.getSalary(), e2.getSalary());// 年龄相同,按工资从大到小排序// return -Double.compare(e1.getSalary(), e2.getSalary());}}).forEach(System.out::println);}
}相关文章:
java8新特性【2023】
Lambda表达式 新的一套语法规则 是一个匿名函数 Testpublic void test1(){Runnable r1 new Runnable(){Overridepublic void run() {System.out.println("线程A");}};r1.run();System.out.println("");Runnable r2 () -> System.out.println("…...
刷题记录:牛客NC51101Lost Cows
传送门:牛客 题目描述: (2≤N≤8,000) cows have unique brands in the range 1..N. In a spectacular display of poor judgment, they visited the neighborhood watering hole and drank a few too many beers before dinner. When it was time to line up for their ev…...
华为OD机试 - 不等式 | 备考思路,刷题要点,答疑 【新解法】
最近更新的博客 华为OD机试 - 寻找路径 | 备考思路,刷题要点,答疑 【新解法】华为OD机试 - 最小叶子节点 | 备考思路,刷题要点,答疑 【新解法】华为OD机试 - 对称美学 | 备考思路,刷题要点,答疑 【新解法】华为OD机试 - 最近的点 | 备考思路,刷题要点,答疑 【新解法】华…...
GuLi商城-SpringCloud-OpenFeign测试远程调用
1. Feign 简介 Feign 是一个声明式的 HTTP 客户端,它的目的就是让远程调用更加简单。Feign 提供了HTTP请 求的模板,通过编写简单的接口和插入注解,就可以定义好 HTTP 请求的参数、格式、地址等信 息。Feign 整合了 Ribbon(负载…...
阿里云_山东鼎信短信的使用(云市场)
目录山东鼎信API工具类随机验证码工具类进行测试Pom依赖(可以先导入依赖)创建controllerSmsServiceSmsServiceImplswagger测试(也可以使用postman)山东鼎信API工具类 山东鼎信短信官网 找到java的Api,复制下来 适当改了一下,为了调用(类名SmsUtils) p…...
基于虚拟机机的代码保护技术
虚拟机保护技术是基于x86汇编系统的可执行代码转换为字节码指令系统的代码,以达到保护原有指令不被轻易逆向和篡改的目的。 字节码(Byte-code)是一种包含执行程序,由一序列 op 代码/数据对组成的 ,是一种中间码。字节是…...
Win10耳机有声音麦不能说话怎么办?麦克风说话别人听不到解决方法
网上找了一些解决办法,一般都是重复的,几个设置调来调去也就那样,没什么用 这种问题一般是“老式”一点的台式机会出现,提供的解决办法如下: 首先下载带面板的音频管理器,如realtek高清晰音频管理器&…...
The 22nd Japanese Olympiad in Informatics (JOI 2022/2023) Final Round 题解
交题:https://cms.ioi-jp.org/documentation A 给一个序列 a1,⋯,ana_1,\cdots,a_na1,⋯,an。 执行nnn个操作,第iii个操作为找出第iii个数前离其最近且与它相同的数的位置,把这两个数之间的数全部赋值aia_iai。求最后的序列。 考虑第…...
openEuler RISC-V 成功适配 VisionFive 2 单板计算机
近日,RISC-V SIG 成功在 VisionFive 2 开发板上适配欧拉操作系统,目前最新版本的 openEuler RISC-V 22.03 V2 镜像已在 VisionFive 2 开发板上可用,这是 openEuler 推动 RISC-V 生态演进的又一新进展。下载链接https://mirror.iscas.ac.c…...
2005-2022中国企业对外直接投资、OFDI海外投资明细、中国全球投资追踪数据CGIT(含非建筑施工类问题投资)
中国全球投资跟踪”(China Global Investment Tracker),数据库,美国企业研究所于1月28日发布。数据库显示,2005年以来,中国对外投资和建设总额已接近2万亿美元。该数据库是唯一一套涵盖中国全球投资和建设的…...
PCB学习笔记——使用嘉立创在线绘制原理图与PCB
嘉立创软件地址:https://lceda.cn/ 新建工程-新建原理图,在元件库中可以搜索元器件,可以直接放置在原理图上。 原理图绘制完成后,保存文件,设计-原理图转PCB,可以直接生成对应的PCB,设置边框&…...
【C++】类型转化
🌈欢迎来到C专栏~~类型转化 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句鸡汤&…...
Mybatis -- resultMap以及分页
查询为null问题 要解决的问题:属性名和字段名不一致 环境:新建一个项目,将之前的项目拷贝过来 1、查看数据库的字段名 2、Java中的实体类设计 public class User { private int id; //id private String name; //姓名 private String passwo…...
Linux之进程
一.冯诺依曼体系 在计算机中,CPU(中央处理器)是不直接跟外部设备直接进行通信的,因为CPU处理速度太快了,而设备的数据读取和输入有太慢,而是CPU以及外设直接跟存储器(内存)打交道&am…...
结构体——“C”
各位CSDN的uu们你们好呀,今天,小雅兰的内容是结构体噢,之前我们在初始C语言中其实就已经学习过了结构体的知识,但是不是很全面,这次,我们也只是稍微详细一点,敬请期待小雅兰之后的博客ÿ…...
CCNP350-401学习笔记(51-100题)
51、Which statement about a fabric access point is true?A. It is in local mode and must be connected directly to the fabric edge switch. B. It is in local mode and must be connected directly to the fabric border node C. It is in FlexConnect mode and must …...
C语言学习_DAY_4_判断语句if_else和分支语句switch_case【C语言学习笔记】
高质量博主,点个关注不迷路🌸🌸🌸! 目录 1.案例引入 2.if判断语句的语法与注意事项 3.switch多分支语句的语法与注意事项 前言: 书接上回,我们已经学习了所有的数据类型、运算符,并且可以书写…...
实验07 赫夫曼编码及综合2022(带程序填空)
A. 【程序填空】赫夫曼编码题目描述给定n个叶子的权值,根据这些权值构造huffman树,并输出huffman编码参考课本第6.6节的算法6.12,注意算法中数组访问是从位置1开始赫夫曼构建中,默认左孩子权值不大于右孩子权值如果遇到两个孩子权…...
分布式 CAP BASE理论
文章目录CAP简介不是所谓的“3 选 2”CAP 实际应用案例BASE简介BASE 理论的核心思想总结CAP 简介 在理论计算机科学中,CAP 定理(CAP theorem)指出对于一个分布式系统来说,当设计读写操作时,只能同时满足以下三点中的…...
三调地类筛选器,Arcgis地类筛选
三调地类在使用是,需要分类统计,这个可以用于筛选; 标准地类筛选 农用地: DLBM IN(0303,0304,0306,0402,0101,0102,0103,0201,0201K,0202,0202K,0203,0203K,0204,0204K,0301,0301K,0302,0302K,0305,0307,0307K,0401,0403,0403K…...
Python基础语法:访问器@property和修改器@xxx.setter
一、简介 访问器和修改器也是装饰器的一种。 property: 访问器,getter xxx.setter: 修改器,setter 访问器和修改器的根本目的是想将属性私有化,提供getter&setter去访问。 访问器和修改器能够做到访问属性其实在调用getter方法࿰…...
古戏台构件声学特性的时域有限差分方法【附模型】
✨ 长期致力于时域有限差分法、窑洞、戏台、八字墙、共形技术研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)曲面共形网格快速生成算法: …...
基于Arduino与应变片传感器的高精度厨房电子秤DIY全攻略
1. 项目概述:用Arduino打造一台高精度厨房电子秤作为一个喜欢在厨房里折腾的硬件爱好者,我经常遇到需要精确称量食材的场合。市面上的电子秤要么精度不够,要么价格不菲,要么功能单一。于是,我萌生了自己动手做一台的想…...
除了排错,你可能不知道OPC Expert v8.1还能做这些:数据归档、计算与冗余实战
解锁OPC Expert v8.1的隐藏潜力:数据归档、实时计算与冗余架构实战指南在工业自动化领域,OPC Expert常被视为故障排查的"急救箱",但它的能力远不止于此。当大多数工程师还在用它解决DCOM配置问题时,少数先行者已经用它重…...
如何在macOS上免费解锁QQ音乐加密文件:完整指南
如何在macOS上免费解锁QQ音乐加密文件:完整指南 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认转换结果…...
Veo 2提示词性能瓶颈诊断:基于1726组AB测试的token敏感度热力图与阈值红线预警
更多请点击: https://kaifayun.com 第一章:Veo 2提示词编写最佳实践总览 Veo 2 是 Google 推出的高性能视频生成模型,其对提示词(prompt)的语义精度、结构清晰度和上下文控制能力高度敏感。高质量提示词并非简单堆砌关…...
通过curl命令快速测试Taotoken大模型API的连通性与返回格式
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过curl命令快速测试Taotoken大模型API的连通性与返回格式 在集成大模型能力到应用时,开发者通常需要一种快速、轻量的…...
万星easy-vibe:描述需求即发布 零基础无需学语法
开源Easy-Vibe是一套开源AI编程学习方案,把学习顺序从先学语法再做项目翻转为直接做项目。文章拆解了项目驱动、提示词编写、AI编辑器和多Agent协作的完整流程,解释了为什么想法比语法更重要。 github上datawhalechina/easy-vibe:它在GitHub…...
告别杂乱!用FileMenu Tools 8.4.2一键清理Windows 11右键菜单(附隐藏技巧)
Windows 11右键菜单精简指南:用FileMenu Tools打造高效工作流每次在文件上点击右键时,那个缓慢弹出的冗长菜单是否让你感到烦躁?随着安装的软件越来越多,Windows的右键菜单往往会变得臃肿不堪,严重影响工作效率。今天&…...
基于Meshtastic构建LoRa Mesh网络:从硬件自制到传感器集成实战
1. 项目概述:构建一个灵活且易用的LoRa Mesh网络 如果你对物联网、远程传感或者去中心化通信网络感兴趣,那么LoRa技术一定不会陌生。它以其超低功耗、超远距离和强大的抗干扰能力,成为了构建广域传感网络的理想选择。然而,传统的…...
