Java 8函数编程轻松入门
函数接口介绍
- 在Java1.8中,新增了Lambda表达式。在.net3.5(C# 3.0)在原先的匿名方法基础上演变出了Lambda表达式。学过C# Lambda表达式的同学,对于Java的Lambda表达式就不会太陌生。
- 在Java中,没有委托的概念,为了配合Lambda表达式,Java推出了函数接口这个概念,来作为Java Lambda表达式的类型。
1. 函数接口定义:
- 函数接口是只有一个抽象方法的接口,用作于Lambda表达式的类型
- 注解:
- 1.在所定义的接口类上加上@FunctionalInterface注解,主要用于编译错误检查
- 2.我们所定义的接口,有且只有一种抽象方法(没有方法体的方法)
- 3.允许定义默认方法(使用default修饰的方法)
- 4.允许定义静态方法
//定义一个函数接口
@FunctionalInterface
public interface Speak {
void say(String msg);
}
//未新增Lambda表达式的时候,实现Speak接口如下
Speak hello = new Speak() {
@Override
public void say(String msg) {
System.out.println(msg);
}
};
hello.say("hello world.");//输出hello world.
//新增Lambda表达式之后,实现Speak接口如下,有没有觉得代码精简许多
Speak hello = msg -> System.out.println(msg);
hello.say("hello world.");//输出hello world.
2. Lambda表达式的简化过程
- lambda表达式有类型推断的功能(Java1.7引入的),可以在javac推断出泛型参数的类型。
//lambda表达式版本1
BinaryOperator<Integer> addComplex = (Integer x, Integer y) -> {
return x - y;
};
//利用类型推断之后的产生版本2,这时候可以省略参数的类型
BinaryOperator<Integer> addComplex = (x, y) -> {
return x - y;
};
//如果Lambda表达式Body只有一行代码,可以省略掉大括号({})
BinaryOperator<Integer> addComplex = (x, y) -> x - y;
3. 系统提供的函数接口
- 在C# 3.0中,有默认提供的Func<...>泛型委托及Action<...>泛型委托。在Java1.8中,同样有类似默认提供的函数接口。其中重要的函数接口如下:
3.1 BinaryOperator
- 参数: (T,T)
- 返回类型: T
- 说明: 二元操作符函数接口
- 示例:
BinaryOperator<Integer> add = (x, y) -> x + y ;
System.out.println(add.apply(1, 2));//3
3.2 UnaryOperator
- 参数: T
- 返回类型: T
- 说明: 一元操作符函数接口
- 示例:
UnaryOperator<Boolean> result = x -> !x;
System.out.println(result.apply(1 > 0));//false
3.3 Predicate
- 参数: T
- 返回类型: boolean
- 说明: 条件判断函数接口
- 示例:
Predicate<Integer> predicate = x -> x > 0;
System.out.println(predicate.test(1));//true
3.4 Consumer
- 参数: T
- 返回类型: void
- 说明: T作为输入,执行某种动作但没有返回值(类似我们上面Speak接口定义的)
- 示例:
Consumer<String> say = msg -> System.out.println(msg);
say.accept("Hello World Java 1.8");//Hello World Java 1.8
3.5 Function
- 参数: T
- 返回类型: R
- 说明: 接受一个T参数,并返回R类型的函数接口
- 示例:
Function<String, Integer> strLen = m -> m.length();//计算输入的字符串的长度
System.out.println(strLen.apply("HelloWorld"));//10
3.6 Supplier
- 参数: None
- 返回类型: T
- 说明: 没有任何输入,返回T
- 示例:
Supplier<String> he=()->"HelloWorld.";
System.out.print(he.get());
4. 总结
- 1.Lambda表达式是一个匿名方法,将行为像数据一样进行传递
2.函数接口指仅具有单个抽象方法的接口,用来表示Lambda表达式的类型
5. 习题
1.哪些是Lambda表达式Function的有效实现,并说明不对的理由。
x -> x + 1;
(x, y) -> x + 1;
x -> x ==1;
- 2.FirstLambda的两个check是能够正确重载,其中firstLambda.check又是调用的哪个check方法
@FunctionalInterface
public interface Check {
boolean IntPred(Integer n);
}
public class FirstLambda {
public static void main(String[] args) {
Predicate<Integer> predicate = x -> x > 0;
FirstLambda firstLambda = new FirstLambda();
boolean result=firstLambda.check(predicate, 2);
System.out.println(result);
}
public boolean check(Predicate<Integer> predicate, int n) {
return predicate.test(n);
}
public boolean check(Check check, int n) {
return check.IntPred(n);
}
}
Java 8函数编程轻松入门的更多相关文章
- Java 8函数编程轻松入门(三)默认方法详解(default function)
default出现的原因 Java 8中对API最大的改变在于集合类,Java在持续演进,但是它一直保持着向后兼容. 在Java 8中为Collection接口增加了stream方法,这意味着所有实现 ...
- Java 8函数编程轻松入门(五)并行化(parallel)
1.并发与并行的区别 并发: 一个时间段内有几个程序都处于已启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但在任一个时刻点只有一个程序在处理机上运行 并行: 在同一个时刻,多核处理多个任务 ...
- Java 8函数编程轻松入门(四)方法引用
C#中系统提供了许多IEnumerable的扩展方法.同样在Java 8中新引入了Collector类. 1.方法引用 定义: 简而言之:就是一个Lambda表达式.在Java 8中,我们我们会使用L ...
- Java 8函数编程轻松入门(二)Stream的使用
在C#中,微软基于IEnumerable接口,提供许多便捷的扩展方法,便于实际的开发.在Java 1.8中,Collection接口新增了default stream方法.我们可以针对java集合,在 ...
- Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18)
摘自: http://www.blogjava.net/BlueSUN/archive/2007/03/10/103014.html Groovy轻松入门--通过与Java的比较,迅速掌握Groovy ...
- Groovy轻松入门——通过与Java的比较,迅速掌握Groovy
转自 :Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18) 在前几篇文章中,我已经向大家介绍了Groovy是什么,学习Groovy的重要性等内容,还不了 ...
- Groovy轻松入门——搭建Groovy开发环境
摘自: http://www.blogjava.net/BlueSUN/archive/2007/03/17/104391.html Groovy轻松入门--搭建Groovy开发环境 多日来,我发表了 ...
- C++ STL编程轻松入门基础
C++ STL编程轻松入门基础 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.4 STL的不同实现版本 2 牛刀小试 ...
- Swift轻松入门——基本语法介绍和详细地Demo讲解(利用WebView打开百度、新浪等网页)
转载请务必注明出处(all copyright reserved by iOSGeek) 本文主要分为两个部分,第一部分介绍Swift的基本语法,第二部分讲解一个利用WebView来打开百度.sina ...
随机推荐
- Tomat简介
Tomcat目录结构bin: 存放各种平台下启动和关闭Tomcat的脚本文件.startup.bat是windows下启动tomcat的文件,shutdown.bat是关闭tomcat的文件.comm ...
- Qt经典出错信息之undefined reference to `vtable for classname
原文链接:Qt经典出错信息之undefined reference to `vtable for classname 这个出错信息太常见了,用过Qt两个月以上的朋友基本上都能自己解决了,因为太经典了, ...
- 递归 CTE
公用表表达式 (CTE) 具有一个重要的优点,那就是能够引用其自身,从而创建递归 CTE.递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达式. 当某个查询引用递归 ...
- [spring源码学习]单元测试演化
1.使用main方法 最早的测试方法一般是在类中增加main方法,然后在main方法中增加对每个方法的测试代码,如果要测其中一个,就屏蔽掉其他的测试代码,执行后,根据log的打印来判断测试是否成功 2 ...
- Unity.Interception(AOP)
在前面我们学习到的是Unity依赖注入(DI)与统一容器来松散耦合,这个设计已经对我们系统带来了很多的好处.但是我们还会想尝试和遵循单一职责,开放封闭原则.比如我们不应该在我们的Bus ...
- 1.Linux常用命令
命令名称:ls 格式: ls [-选项] [参数] 注:中括号表示可选 命令路径:/bin/ls 功能描述:显示信息 例如: 选项 -a 显示所有的文件,包括隐藏文件,(以 . 开头的文件) -l ...
- iOS之防止用户重复点击Button(按钮)问题
在项目中,我们往往会遇到这样的问题:因为网络较慢的原因,用户会不耐烦的一直去点击按钮,这样导致的结果时:相关代码一遍一遍的被重复执行,如果按钮的事件是网络请求的话,这样又导致一种网络请求的循环.所以我 ...
- Java 程序员必须掌握的 Linux 命令(转:导师Jencks)
1.查找文件 find / -name filename.txt根据名称查找/目录下的filename.txt文件. find . -name "*.xml"递归查找所有的xml文 ...
- 【原】iOS学习之Quartz2D(1)
什么是Quartz2D 1.Quartz 2D 是一个二维绘图引擎,同时支持iOS和Mac系统 2.Quartz 2D 能完成的工作: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成 ...
- bzoj1001最小割
听说最大流过不去??? dinic果然神了,1000,000的点都能过(主要是比较稀疏) #include <cstdio> #define INF 9223372036854775807 ...