浅谈 Java 中的 Lambda 表达式
更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验
Lambda
表达式是一种匿名函数,它可以作为参数传递给方法或存储在变量中。在 Java8
中,它和函数式接口一起,共同构建了函数式编程的框架。
什么是函数式编程
函数式编程是一种编程范式,也是一种思想。
它将计算视为函数求值的过程,并强调函数的纯粹性和不可变性。在函数式编程中,函数被视为一等公民,可以作为参数传递、存储在变量中,并且函数的执行不会产生副作用。
例如,我们想要输出 List
中的全部元素,命令式编程看起来是下面这样:
public class Main {public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);for (Integer item : list) {System.out.println(item);} }
}
而在函数式编程的思想下,代码则看起来是下面这样:
public class Main {public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);list.forEach(System.out::println);}
}
从以上的两个例子中,可以看出,命令式编程需要我们自己去实现具体的逻辑细节。而函数式编程则是调用 API
完成需求的实现,将原本命令式的代码写成一系列嵌套的函数调用。
由此可见,在函数式编程的思想下,我们将功能的具体细节隐藏,将其抽象为了函数式接口,这就使得具有规范、稳定、可组合、高复用的特点。
Lambda 与匿名内部类
既然函数式编程需要将功能抽象为接口,那么我们来回顾一下接口的使用。
接口作为 java
中的一种抽象类型,它定义了一组方法的签名(方法名、参数列表和返回类型),但没有具体的实现。
因此,要使用接口,就必须提供相应的实现类,或者包含实现接口的对象返回。例如,要想使用 List
接口,我们可以使用实现了该接口的实现类 ArrayList
、LinkdeList
等,或者像上节例子一样,使用 Arrays.asList
的工厂方法返回了一个实现了 List
接口的 ArrayList
对象。
其中,对于实现类来说,由于接口只需要实现某种功能,我们完全可以使用匿名内部类来实现,例如,我们把输出 List
的全部元素抽象为一个接口 Show
,其中提供了一个函数方法 ShowAllItems
。
public interface Show {void ShowAllItems(List<Integer> arrayList);
}
继续沿用之前代码示例,现在要求输出 List
中的全部元素:
public class Main {public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);Show show = new Show() {@Overridepublic void ShowAllItems(List<Integer> arrayList) {for (Integer item : arrayList) System.out.println(item);}};show.ShowAllItems(list);}
}
上述代码中,由于接口 Show
其中只有一个抽象方法 ShowAllItems
,如果单独为该接口实现一个类未免显得太过笨拙,因此我们在使用时直接使用匿名内部类的实现,通过这种方式创建一个临时的实现子类,这就令接口的使用更加灵活。
那么问题来了,如果我们后续仍要使用多次该接口,每次使用都以匿名内部类的方式来实现,会导致我们的代码太过臃肿,有没有更好的解决办法呢?
当然有的,这就是我们今天讨论的主人公—— Lambda
表达式,如果一个接口中有且只有一个待实现的抽象方法,那么我们可以将匿名内部类简写为 Lambda
表达式:
public class Main {public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);Show show = param -> {for (Integer item : param) System.out.println(item);};show.ShowAllItems(list);}
}
也许上面的示例会使你感到困惑,下面我们来详细探讨一下 Lambda
表达式的基础语法。
Lambda 表达式基础语法
- 标准格式为:
([参数类型 参数名称,]...) ‐> { 代码语句,包括返回值 }
- 和匿名内部类不同,
Lambda
表达式仅支持接口,不支持抽象类。 - 接口内部必须有且仅有一个抽象方法(可以有多个方法,但是必须保证其他方法有默认实现,必须留一个抽象方法出来)
Lambda
表达式可以在函数体中引用外部的变量,从而实现了闭包,但对进入闭包的变量有final
的限制。
接下来,我们看一个简单示例,假设接口 Test
中有且仅有如下抽象方法:
public interface Test {String showTestNumber(Integer param);
}
利用上述接口,我们使用如下匿名内部类来实现该方法:
public class Main {public static void main(String[] args) {Test test = new Test() {@Overridepublic String showTestNumber(Integer param) {return "Test number is " + param;}};System.out.println(test.showTestNumber(114));}
}
如果将其转换为 Lambda
的标准格式,则为:
public class Main {public static void main(String[] args) {Test test = (Integer param) -> {return "Test number is " + param;};System.out.println(test.showTestNumber(514));}
}
由于该方法只需传递一个参数,因此可以省略参数类型及其括号:
public class Main {public static void main(String[] args) {Test test = param -> {return "Test number is " + param;};System.out.println(test.showTestNumber(1919));}
}
又因为方法实现只有一条 return
语句,则后面的 { ... }
也可以省略:
public class Main {public static void main(String[] args) {Test test = param -> "Test number is " + param;System.out.println(test.showTestNumber(810));}
}
此外,如果方法已经实现,我们可以利用方法引用:
public class Main {public static void main(String[] args) {Test test = Main::showTestNumber;System.out.println(test.showTestNumber(721));}// 提取方法实现private static String showTestNumber(Integer param) {return "Test number is " + param;}
}
在上述示例代码中,Main::showTestNumber
是一个方法引用,它引用了 Main
类中的静态方法 showTestNumber
。该方法被赋值给 Test
接口的实例变量 test
。
关于方法引用的使用,我们在后面还会重新提到。但这里我需要先介绍一下关于闭包的特性。
闭包是一个函数(或过程),它可以访问并操作其作用域外部的变量。在
Java
中,可以通过Lambda
表达式或方法引用来创建闭包。
其实,在 main
方法中,我们还可以通过调用 test.showTestNumber
来调用闭包。闭包中的方法 showTestNumber
可以访问并操作其作用域外部的变量。
为了更清晰地展示 Lambda
的闭包过程,我们使用如下示例:
public class Main {public static void main(String[] args) {String Claim = "Test number is ";Test test = param -> Claim + param;System.out.println(test.showTestNumber(2333));}
}
在上述示例代码中,Lambda
表达式捕获了外部变量 Claim
,并在 Lambda
表达式的范围之外(main()方法内部)调用闭包时仍然可以访问和使用该变量。
注意:Java8
不要求显式将闭包变量声明为 final
,但如果你尝试修改闭包变量的值,则会报错。
public class Main {public static void main(String[] args) {String Claim = "Test number is ";Claim = "Yeah~ The number is "; // 从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量Test test = param -> Claim + param; System.out.println(test.showTestNumber(2333));}
}
Lambda 的应用
好了,你已经学会 1 + 1 = 2 1 + 1 = 2 1+1=2 了,现在来康康更实际的东西吧(
无参的函数式接口
以最常用的 Runnable
接口为例:
在 Java8
之前,如果需要新建一个线程,使用匿名内部类的写法是这样:
public class Main {public static void main(String[] args) {Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("哼哼哼啊啊啊~");}};runnable.run();}
}
如果使用 Lambda
表达式则看起来是这样;
public class Main {public static void main(String[] args) {Runnable runnable = () -> System.out.println("哼哼哼啊啊啊~");runnable.run();}
}
我们来看一下具体的 Runnable
接口:
@FunctionalInterface
public interface Runnable {public abstract void run();
}
可以看到该接口上面有 @FunctionalInterface
注解,该注解标识了一个接口是函数式接口。因此,我们可以使用 Lambda
表达式将匿名内部类进行替换。
值得注意的是,@FunctionalInterface
注解并不是必须的,它只是作为一种提示和约束的工具。当我们在定义接口时,如果希望该接口只包含一个抽象方法,以便可以使用 Lambda
表达式或方法引用进行函数式编程,可以选择添加 @FunctionalInterface
注解来明确表达这个意图。
即使没有添加 @FunctionalInterface
注解,只要该接口符合函数式接口的定义(只有一个抽象方法),它仍然可以用于函数式编程。
带参的函数式接口
这里假设我们需要对一个数组进行排序:
在 Java8
之前,对数组进行排序可以使用 Arrays.sort
方法,如果需要指定排序规则,只需要实现其中的 Comparator
方法即可:
public class Main {public static void main(String[] args) {Integer[] array = new Integer[]{4, 5, 9, 3, 2, 8, 1, 0, 6};Arrays.sort(array, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1 - o2;}});System.out.println(Arrays.toString(array)); //按从小到大的顺序排列}
}
转换为 Lambda
表达式可以是下面这样:
public class Main {public static void main(String[] args) {Integer[] array = new Integer[]{4, 5, 9, 3, 2, 8, 1, 0, 6};Arrays.sort(array, (o1, o2) -> o1 - o2);System.out.println(Arrays.toString(array)); //按从小到大的顺序排列}
}
方法引用
Java
方法引用是一种简化 Lambda
表达式的语法,用于直接引用已经存在的方法。方法引用可以通过以下几种方式来表示:
-
静态方法引用:引用静态方法,使用类名或者接口名作为前缀,后面跟上方法名。例如我们在之前例子中介绍过的
Main::showTestNumber
。 -
实例方法引用:引用非静态方法,使用对象名或者对象引用作为前缀,后面跟上方法名。例如,
objectName::instanceMethodName
。 -
特定类的任意对象方法引用:引用特定类的实例方法,使用类名作为前缀,后面跟上方法名。例如,
ClassName::instanceMethodName
。 -
构造方法引用:引用构造方法,使用类名后面跟上
new
关键字。例如,ClassName::new
。 -
数组构造方法引用:引用数组的构造方法,使用数组类型后面跟上
new
关键字。例如,TypeName[]::new
。
需要注意的是,方法引用的适用条件是被引用的方法的签名(参数类型和返回类型)必须与函数式接口中的抽象方法的参数类型和返回类型相匹配。
我们使用上节数组排序的情景进行举例,即使我们已经利用 Lambda
表达式进行了大幅度的简化,但是这还不够,我们观察 Integer
类,其中有一个叫做 compare
的静态方法:
public static int compare(int x, int y) {return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
该方法是一个静态方法,但是它却和 Comparator
需要实现的方法返回值和参数定义一模一样,因此我们直接进行方法引用:
public class Main {public static void main(String[] args) {Integer[] array = new Integer[]{4, 5, 9, 3, 2, 8, 1, 0, 6};Arrays.sort(array, Integer::compare);System.out.println(Arrays.toString(array)); //按从小到大的顺序排列}
}
如果不使用静态方法,而使用普通的成员方法,即在 Comparator
中,我们需要实现的方法为:
public int compare(Integer o1, Integer o2) {return o1 - o2;
}
其中 o1
和 o2
都是 Integer
类型,而在 Integer
类中有一个 compareTo
方法:
public int compareTo(Integer anotherInteger) {return compare(this.value, anotherInteger.value);
}
我们可以将之前的匿名内部类实现替换为 Lambda
如下:
public class Main {public static void main(String[] args) {Integer[] array = new Integer[]{4, 5, 9, 3, 2, 8, 1, 0, 6};Arrays.sort(array, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1.compareTo(o2);}});System.out.println(Arrays.toString(array)); //按从小到大的顺序排列}
}
由于该方法并非静态方法,而是所属的实例对象所有,如果我们想要引用该方法,我们需要进行实例方法引用:
public class Main {public static void main(String[] args) {Integer[] array = new Integer[]{4, 5, 9, 3, 2, 8, 1, 0, 6};Arrays.sort(array, Integer::compareTo);System.out.println(Arrays.toString(array)); //按从小到大的顺序排列}
}
虽然看起来和刚才的静态方法引用没有什么区别,但实际上,当我们使用非静态方法时,会使用抽象方参数列表的第一个作为目标对象,后续参数作为目标对象成员方法的参数,即 o1
作为目标对象,o2
作为参数,正好匹配了 compareTo
方法。
对于构造方法引用,假设接口 Test
中有抽象方法 newTest
:
public interface Test {String newTest(String param);
}
对于普通的 Lambda
替换,代码如下:
public class Main {public static void main(String[] args) {Test test = param -> param;System.out.println(test.newTest("哼哼哼啊啊啊~"));}
}
而我们注意到该方法其实就是 String
中的构造方法,因此我们直接进行构造方法引用:
public class Main {public static void main(String[] args) {Test test = String::new;System.out.println(test.newTest("哼哼哼啊啊啊~"));}
}
Lambda 表达式的本质
经过上面的学习,相信你已经可以熟练地使用 Lambda
表达式了,看起来 Lambda
只是一种简化匿名内部类进行实现接口的语法糖,但实际上,它们是两种本质不同的事物:
- 匿名内部类本质是一个类,只是不需要我们显示地指定类名,编译器会自动为该类取名。
- 而
Lambda
表达式本质是一个函数,当然,编译器也会为它取名,在JVM
层面,这是通过invokedynamic
指令实现的,编译器会将Lambda
表达式转化为一个私有方法,并在需要的时候动态地生成一个函数式接口的实例。
假设我们使用上述 Runnabke
的匿名内部类的代码进行编译,可以看到结果如下:
可以看到, Main$1.class
实际上就是 Main
类中生成的匿名内部类文件,而将其替换为 Lambda
表达式后编译的结果如下:
没有生成单独的类文件,即,匿名内部类对应的是一个 class
文件,而 Lambda
表达式对应的是它所在主类的一个私有方法。
参考文献
- Java中的函数式编程
- Java Lambda 表达式介绍
- 在Java代码中写Lambda表达式是种怎样的体验
相关文章:
浅谈 Java 中的 Lambda 表达式
更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 Lambda 表达式是一种匿名函数,它可以作为参数传递给方法或存储在变量中。在 Java8 中,它和函数式接口一起,共同构建了函数式编程的框架。 什么是函数式编程 函数式编程是…...
闭包的概念
概念 内层函数可以访问到外层函数的变量和参数,即一个函数和它周围状态捆绑在一起的组合。 举例 函数作为返回值 // 函数作为返回值 function test(){const a 1;return function() {console.log(a:,a);} }const fn test(); const a 6; fn(); // 1 2. 函数作…...
openGauss学习笔记-52 openGauss 高级特性-LLVM
文章目录 openGauss学习笔记-52 openGauss 高级特性-LLVM52.1 适用场景52.2 非适用场景52.3 其他因素对LLVM性能的影响52.4 LLVM使用建议 openGauss学习笔记-52 openGauss 高级特性-LLVM openGauss借助LLVM(Low Level Virtual Machine)提供的库函数&…...
MySQL 8.0字符集校正
MySQL升级为8.0版本时,之前版本的字符集往往是不同的,需要校正。 执行下面的三个SQL语句的查询结果,可以从库、表、列三个层面对字符集进行校正。 库 select concat(alter database , schema_name, default character set utf8mb4 collate …...
软考:中级软件设计师:数据库恢复与备份,故障与恢复,反规范化
软考:中级软件设计师:数据库恢复与备份 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准备…...
Unbutu系统-Docker安装、JDK环境配置,Docker常用指令、Docker安装MySQL、Redis、Tomcat、Nginx,前端后分离项目部署
目录 1、防火墙 1.1、查看防火墙状态 1.2、开启防火墙 1.3、关闭防火墙 1.4、重启防火墙 1.5、查看防火墙版本 2、安装JDK 2.1、官网下载tar包 2.3、解压tar.gz文件 2.4、配置环境变量 2.4.1、查看安装路径 2.4.2、设置环境变量 2.4.3、执行该让环境变量生效 2.4…...
Python绘图系统10:在父组件中使用子组件的函数
文章目录 Combobox绑定事件互相调用源代码 Python绘图系统: 📈从0开始实现一个三维绘图系统自定义控件:坐标设置控件📉坐标列表控件📉支持多组数据的绘图系统图表类型和风格:散点图和条形图📊混…...
【Linux的成长史】Linux的发展史
🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如…...
OLED透明屏是什么?什么叫做OLED透明屏的原屏?
OLED透明屏是一种新型的显示技术,具有高对比度、高亮度和能耗低等优势,正被越来越广泛地应用于各个领域中。 在OLED透明屏中,原屏是至关重要的元件之一。本文将深入探讨OLED透明屏原屏的意义、制造过程、品质要求、应用案例和发展趋势&#…...
Redis 持久化的手段有哪些 ?RDB 和 AOF 有什么区别 ?
目录 1. Redis 持久化的手段有哪些 2. RDB 和 AOF 有什么区别 2.1 RDB 持久化 2.2 AOF 持久化 2.2.1 AOF 持久化策略有哪些 3. 混合持久化是如何执行的(了解) 1. Redis 持久化的手段有哪些 Redis 持久化的手段有三种: 快照方式&#…...
【Vue】vue2预览显示quill富文本内容,vue-quill-editor回显页面,v-html回显富文本内容
文章目录 前言一、下载二、使用步骤1.引入样式2.html代码 总结 前言 提示:这里可以添加本文要记录的大概内容: vue后台框架,若依系统里有一个富文本编辑器,效果如下 在package.json里面查看,发现插件名叫quill 插件的…...
华纳云:ubuntu下nginx服务器如何配置
在Ubuntu操作系统上配置Nginx服务器涉及以下步骤。这里我将提供一个基本的配置示例,你可以根据自己的需求进行修改和定制。 安装 Nginx: 打开终端,并输入以下命令来安装 Nginx: sudo apt update sudo apt install nginx 启动 …...
PTP时间同步例程
下面是一个基本的PTP时间同步例程,可以使用Arduino或其他类似的微控制器实现: 步骤1:准备硬件 - 一个Arduino或类似的微控制器 - 一个以太网模块 步骤2:导入库文件 #include <Ethernet.h> #include <EthernetUdp.h>…...
【ES6】ES6遍历属性的方法
在ES6中,有几种遍历属性的方法,其中包括: 使用for…in循环和Object.keys()方法。 let obj {a: 1, b: 2, c: 3}; for (let key in obj) {console.log(obj[key]); }使用for…of循环和Object.values()方法。 let obj {a: 1, b: 2, c: 3}; f…...
【Web系列二十四】使用JPA简化持久层接口开发
目录 环境配置 1、引入依赖 配置文件 代码编写 实体类创建 JPA常用注解 Service与ServiceImpl Service ServiceImpl Controller Dao 三种实现Dao功能方式 1.继承接口,使用默认接口实现 2.根据接口命名规则默认生成实现 3.自定义接口实现(类似MyBatis…...
Flink流批一体计算(16):PyFlink DataStream API
目录 概述 Pipeline Dataflow 代码示例WorldCount.py 执行脚本WorldCount.py 概述 Apache Flink 提供了 DataStream API,用于构建健壮的、有状态的流式应用程序。它提供了对状态和时间细粒度控制,从而允许实现高级事件驱动系统。 用户实现的Flink程…...
软考高级系统架构设计师系列论文九十三:论计算机网络的安全性设计
软考高级系统架构设计师系列论文九十三:论计算机网络的安全性设计 一、计算机网络安全性设计相关知识点二、摘要三、正文四、总结一、计算机网络安全性设计相关知识点 软考高级系统架构设计师:计算机网络...
山西电力市场日前价格预测【2023-08-29】
日前价格预测 预测明日(2023-08-29)山西电力市场全天平均日前电价为321.48元/MWh。其中,最高日前电价为372.80元/MWh,预计出现在19: 30。最低日前电价为272.85元/MWh,预计出现在12: 30。 价差方向预测 1: 实…...
计算机毕设 基于深度学习的人脸专注度检测计算系统 - opencv python cnn
文章目录 1 前言2 相关技术2.1CNN简介2.2 人脸识别算法2.3专注检测原理2.4 OpenCV 3 功能介绍3.1人脸录入功能3.2 人脸识别3.3 人脸专注度检测3.4 识别记录 4 最后 1 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新…...
ES 7.6 - APi基础操作篇
ES7.6-APi基础操作篇 前言相关知识索引相关创建索引查询索引查询所有索引删除索引关闭与打开索引关闭索引打开索引 冻结与解冻索引冻结索引解冻索引 映射相关创建映射查看映射新增字段映射 文档相关(CURD)新增文档根据ID查询修改文档全量覆盖根据ID选择性修改根据条件批量更新 …...
【Go 基础篇】Go语言循环结构:实现重复执行与迭代控制
介绍 循环结构是编程中的重要概念,它允许我们重复执行一段代码块,或者按照一定的条件进行迭代控制。Go语言提供了多种循环结构,包括for、while和do-while等,用于不同的场景下实现循环操作。本篇博客将深入探讨Go语言中的循环结构…...
RabbitMQ笔记-RabbitMQ基本术语
RabbitMQ基本术语 相关概念; 生产者(Producer):投递消息。消息:消息体(payload)标签(label);生产者把消息交给rabbitmq,rabbitmq会根据标签把消息发给感兴趣…...
Git向远程仓库与推送以及拉取远程仓库
理解分布式版本控制系统 1.中央服务器 我们⽬前所说的所有内容(⼯作区,暂存区,版本库等等),都是在本地也就是在你的笔记本或者计算机上。⽽我们的 Git 其实是分布式版本控制系统!什么意思呢? 那我们多人…...
PostgreSQL+SSL链路测试
SSL一个各种证书在此就不详细介绍了,PostgreSQL要支持SSL的前提需要打开openssl选项,包括客户端和服务器端。 测试过程。 1. 生成私钥 root用户: mkdir -p /opt/ssl/private mkdir -p /opt/ssl/share/ca-certificateschmod 755 -R /opt/ss…...
服务器(容器)开发指南——code-server
文章目录 code-server简介code-server的安装与使用code-server的安装code-server的启动code-server的简单启动指定配置启动code-server code-server环境变量配置 code-server端口转发自动端口转发手动添加转发端口 nginx反向代理code-servercode-server打包开发版镜像 GitHub官…...
C++贪吃蛇(控制台版)
C自学精简实践教程 目录(必读) 目录 主要考察 需求 输入文件 运行效果 实现思路 枚举类型 enum class 启动代码 输入文件data.txt 的内容 参考答案 学生实现的效果 主要考察 模块划分 文本文件读取 UI与业务分离 控制台交互 数据抽象 需求 用户输入字母表示方…...
Java之字符串实践
功能概述 字符串是Java编程中常用的数据类型,本文对String部分常见功能做了对应实践以及分析。 功能实践 场景1:字符串比较 用例代码 Test public void test_string_compare() {String s1 "abc";String s2 s1;String s5 "abc&quo…...
BM20 数组中的逆序对
描述 解题思路:归并排序 分治:分治即“分而治之”,“分”指的是将一个大而复杂的问题划分成多个性质相同但是规模更小的子问题,子问题继续按照这样划分,直到问题可以被轻易解决;“治”指的是将子问题单独进…...
高德猎鹰轨迹查询相关接口
高德猎鹰轨迹官网:服务管理-API文档-开发指南-猎鹰轨迹服务 | 高德地图API 轨迹查询 httpclient的post // post方法请求 创建轨迹 private static void createTrace() {String key "高德注册的key";String sid "服务id"; // 服务idString…...
整理总结新手开始抖音小店经营:常见问题及解决办法
抖音小店作为一种新兴的电商模式,在短时间内获得了广泛的关注和使用。然而,对于新手来说,抖音小店经营可能会遇到一些问题。下面是四川不若与众总结的一些常见的问题以及相应的解决办法。 问题一:产品选择困难 对于新手来说&#…...
怎么用adobe软件做网站/微信引流主动被加软件
本节书摘来自异步社区《深入解析IPv6(第3版)》一书中的第1章,第1.2节,作者: 【美】Joseph Davies 更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.2 IPv4地址空间受限的后果 由于IPv4的地址相对比较稀缺,人…...
手机网站大全12345/站长工具域名查询社区
1.高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期࿰…...
临沂网站建设公司全国/惠州网站seo
有的时候,大家可能会遇到这种需求:显示某个物体的线框,就像汽车设计图纸(CAD之类的)那样。例如下面这种效果: 效果1: 效果2: 用shader就可以解决这个问题。甚至可以不写代码&#x…...
网站建设资质/惠州seo收费
2019独角兽企业重金招聘Python工程师标准>>> 1.官方推荐使用1.6 JDK,使用1.7JDK签名,dos下的指令是不一样的,我尝试过用1.8 JDK签名,一直都不行。(........................无语ing) 2.Robotium…...
wordpress字典/百度云超级会员试用1天
基于人脸识别的移动支付方式-刷脸支付,随着人脸识别技术的发展和应用逐渐在零售、餐饮等消费场景上线应用。而且刷脸支付可结合自助收银系统实现刷脸支付自助收银应用。那么,刷脸支付自助收银怎么助力零售门店? 刷脸支付自助收银使收银结账…...
深圳沙头网站建设/个人免费建站系统
基于HSV颜色模型的直方图均衡化图像去雾技术_百度学术 http://xueshu.baidu.com/s?wdpaperuri%3A(8622e930fa7d1a1a46986dd38a978659)&filtersc_long_sign&tnSE_baiduxueshu_c1gjeupa&ieutf-8&sc_ks_paraq%3D%E5%9F%BA%E4%BA%8EHSV%E9%A2%9C%E8%89%B2%E6%A8%A…...