Lambda表达式与Function接口
Lambda表达式是一个匿名函数。C++ 11和 java 8 相继引入了有关对Lambda表达式的支持。
Lambda表达式对于高级语言而言并不是必要的,对于Java而言它的功能和一个简易的接口差不多,而C++也有传统的函数指针。但即便如此,lambda表达式还是一项颇受重视的高级语言新特性,因为它可以大大简化我们的代码,也提供了一条函数式编程的捷径。
简而言之,一个Lambda表达式可以看作一个变量。对于这种变量的类型java语言中引入了很多种。我们主要来研究使用比较多的Function接口。他是一个有两个泛型参数的接口,其中一个是返回值的类型,一个是参数的类型(注意这个接口只接受一个参数)。在java中,它可以被赋值为一个类静态方法、对象的方法、函数式接口,当然也包括我们提到的Lambda表达式。这里就要和C++的function类区分开了。在C++中,function接受的泛型是一个更格式化的函数声明格式,它可以接受更多的参数。因此虽然这两个function看似很亲近,实际上区别还是挺大的。这也是Java提供更多函数类型的原因。
下面是一个非常简单的示例,通过示例我们可以看出二者lambda表达式和所谓的function类型的不同。但是总体上而言大同小异。
java:
import java.util.function.Function; public class Test { public static Function<Integer,Integer> getFactorial; public static Function<Integer,Integer> getSum; public static Function<Integer,Integer> getMaxBase4; public static void main(String[] args) { loadingFunctions(); getResult(getFactorial, "10的阶乘是:"); getResult(getSum, "10的和是:"); getResult(getMaxBase4, "10的以内4的倍数的最大值是:"); } public static void getResult(Function<Integer, Integer> f, String functionType) { System.out.println(functionType + f.apply(10)); } public static void loadingFunctions() { getFactorial = (n) -> { n--; if(n == 0) return 1; else return (n+1) * getFactorial.apply(n); }; getSum = (n) -> { n--; if(n == 0) return 1; else return (n+1) + getSum.apply(n); }; getMaxBase4 = (n) -> { int last = -1; while(n > 3) { if(n % 4 == 0) { last = n; break; } n--; } return last; }; } }
c++:
#include <iostream> #include <string> #include <functional> using namespace std; function<int(int)> getFactorial; function<int(int)> getSum; function<int(int)> getMaxBase4; void getResult(function<int(int)> f, string functionName) { cout << functionName << ) << endl; } void loadingFunctions() { getFactorial = [](int n) { n--; ) ; else )*getFactorial(n); }; getSum = [](int n) { n--; ) ; else ) + getSum(n); }; getMaxBase4 = [](int n) { ; ) { == ) { last = n; break; } n--; } return last; }; } int main() { loadingFunctions(); getResult(getFactorial, "10的阶乘"); getResult(getSum, "10的和"); getResult(getMaxBase4, "10以下4的倍数的最大值"); cout << "--------" << endl; system("pause"); }
这两个示例中,我们可以看到我们虽然都调用同一个getResult方法,而打印的结果是不同的,原因就是我们传入了不同的方法函数作为参数。用这种function类型作为参数可以大大的简化我们的代码。
Lambda表达式与Function接口的更多相关文章
- 009-jdk1.8版本新特性一-展方法,Lambda表达式,函数式接口、方法引用构造引用
一.JDK1.8 名称:Spider(蜘蛛) 发布日期:2014-03-18 新特性: 1.1.扩展方法[接口的默认方法] Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 defaul ...
- java8 Lambda 表达式和函数式接口快速理解
前言 接上篇文章 java8 新特性 由于上篇过于庞大,使得重点不够清晰,本篇单独拿出 java8 的 Lambda 表达式和函数式接口说明. Lambda 表达式 lambda 表达式其实就是使用了 ...
- Lambda表达式和函数式接口
写在有道笔记中,链接地址.欢迎各位看官提出意见交流讨论 http://note.youdao.com/noteshare?id=147109f1bf7f3ae97c43d77891e6ebc8 Lam ...
- Java8 Lambda表达式、函数式接口和方法引用
目录 Java8 Lambda表达式和函数式接口 Lambda表达式 Lambda的使用 函数式接口FunctionalInterface Java内置四大核心函数式接口 方法引用 构造器引用 Jav ...
- Lambda表达式与函数式接口
Lambda表达式的类型,也被称为目标类型(targer type),Lambda表达式的目标类型必须是"函数式接口(functional interface)".函数式接口代表只 ...
- lambda表达式与函数接口的关系以及使用案例
lambda表达式与函数式接口是结合使用的. 函数式接口:接口中只有一个抽象方法的接口,其中可以包括default修饰,static 修饰的实例方法.函数式接口可以在接口上添加@FuncationIn ...
- Java8新特性(一)——Lambda表达式与函数式接口
一.Java8新特性概述 1.Lambda 表达式 2. 函数式接口 3. 方法引用与构造器引用 4. Stream API 5. 接口中的默认方法与静态方法 6. 新时间日期 API 7. 其他新特 ...
- 还看不懂同事的代码?Lambda 表达式、函数接口了解一下
当前时间:2019年 11月 11日,距离 JDK 14 发布时间(2020年3月17日)还有多少天? // 距离JDK 14 发布还有多少天? LocalDate jdk14 = LocalDate ...
- java8新特性1:lambda表达式和函数式接口
1.lambda的介绍: 1.1.为什么java语言需要引入lambda表达式? java语言诞生于1995年,历史时间已经相对较长了.在其后的各种新型编程语言中,都有着lambda表达式的内容,并且 ...
随机推荐
- Servlet&jsp基础:第一部分
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [SAP ABAP开发技术总结]数据引用(data references)、对象引用(object references)
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- STORM_0007_Multi-Lang protocol of Storm/多语言协议的翻译
原始地址: http://storm.apache.org/releases/1.0.1/Multilang-protocol.html 这个协议试用0.7.1之后的版本 通过ShellBolt和 ...
- iOS - Swift NSNumber 数字
前言 public class NSNumber : NSValue public class NSDecimalNumber : NSNumber NSNumber 可以被赋值为各种数值类型.我们可 ...
- ssis freach loop container 传入变量给 某些数据源的时候。
ssis freach loop container 传入变量给 某些数据源的时候. 应该选择loop container ,设置delayvalidateion为true. 这样数据源控件就不会报e ...
- 控制执行流程 Thinking in Java 第四章
4.1 true 和 false *Java 不允许将一个数字作为布尔类型(虽然在C和C++中可以),使用时需要条件表达式将其转换为布尔类型: 如下: if( a!= 0) 4.2 if-else 4 ...
- 用Maven创建第一个项目
1.在Eclipse左侧的空白处点击鼠标右键,选择:New>Other : 2.选择Maven项目,点击"Next"按钮: 3.保持默认,直接点击“Next”按钮: 4.选择 ...
- placeholder在不同浏览器下的表现及兼容方法(转)
1.什么是placeholder? placeholder是html5新增的一个属性,当input或者textarea设置了该属性后,该值的内容将作为灰字提示显示在文本框中,当文本框获得焦点(或 ...
- mysql 大数据量求平均值
需求是:对于一个设备,求一天内每个小时的平均值,一个月内每天的平均值,更通用的需求是,从起始时间到结束时间,每隔一段时间,求一个平均值.目前的解决策略是:在存储过程中进行处理,从起始时间到结束时间,切 ...
- uploadify多图片上传实例
upload.php <html> <head> <meta http-equiv="Content-Type" content="text ...