两者关系:

Lambda表达式就是函数式接口(FunctionalInterface)实现的快捷方式,它相当于函数式接口实现的实例,因为在方法中可以使用Object作为参数,所以把Lambda表达式作为方法的参数也是可以的。

函数式接口只有一个抽象方法,并且没有重写Object类中的方法(Object类中的public的方法除外),可以有默认方法和静态方法。

函数式接口一般用注解@FunctionalInterface标注。

例子:

1、声明一个函数式接口

@FunctionalInterface
public interface Calculator { double calculate(int a, int b); }

2、使用Lambda表达式(参数类型可省略)

Calculator division  = (int a, int b) -> (double) a / b;
System.out.println(division.calculate(5, 2)); // prints 2.5

另一个例子(使用jdk标准库内的函数式接口,下滑至文末查看更多):

Function<Integer, Integer> selfIncrease = x -> x + 1;
Function<Integer, Integer> twiceValue = x -> 2*x;
Consumer<Integer> printNum = x -> System.out.println("2x+1:"+selfIncrease.apply(x)); int [] numbers= {1, 2, 3};
Arrays.stream(numbers).boxed().map(twiceValue).forEach(printNum);
System.out.println("通过表达式后的数组:"+Arrays.toString(numbers));

输出:

2x+1:3

2x+1:5

2x+1:7

通过表达式后的数组:[1, 2, 3]

3、使用Lambda表达式作为方法参数

public static void main(String[] args) throws Exception {
execute(a -> String.valueOf(a + 1), 10);
} public static void execute(Function<Integer, String> func, int num) {
System.out.println(func.apply(num));
}

4、问题

  • 标准库内没有提供支持更多参数的函数式接口
  • lambda表达式中引用到的变量需要实际是final
// 编译通过
public static void main(String[] args) throws Exception {
int num = 10;
Function<Integer, Integer> lambda = x -> x + num;
} // 编译错误
public static void main(String[] args) throws Exception {
int num = 10;
num += 1;
Function<Integer, Integer> lambda = x -> x + num;
}

5、函数式接口

http://www.cnblogs.com/IcanFixIt/p/4284418.html

函数式接口

描述

Function

传递一个参数返回一个结果。这个结果的类型可以与参数的类型不相同。

BiFunction

传递两个参数返回一个结果。这个结果的类型可以与任一参数的类型不相同。

UnaryOperator

代表一个操作符的操作,它的返回结果类型与操作符的类型一样。实际上它可以被看作是Function 它的返回结果跟参数一样,它是Function 的子接口。

BiOperator

代表两个操作符的操作,它的返回结果类型必须与操作符相同。

Predicate

传递一个参数,基于参数的值返回boolean值。

Supplier

代表一个供应者的结果。

Consumer

传递一个参数但没有返回值。

具体使用可以查看jdk源码里的抽象方法的方法返回值,方法参数,以及函数式接口定义说明。

参考:

http://www.cnblogs.com/IcanFixIt/p/4284418.html

http://blog.soliloquize.org/2015/07/07/Java-8%E4%B8%AD%E7%9A%84%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B%E4%B8%80/

Java8函数式接口和Lambda表达式的更多相关文章

  1. Java8函数式接口以及lambda表达式实践

    罗列一下遇到可以转换成lamada表达式的场景,仅供参考,如有更好的方式,欢迎在评论区留言. 1.计算订单总金额 订单总金额一般是在后台循环叠加每个购买商品的金额已获取到,通常的方式如下 BigDec ...

  2. Java函数式接口与Lambda表达式

    什么是函数式接口? 函数式接口是一种特殊的接口,接口中只有一个抽象方法. 函数式接口与Lambda表达式有什么关系? 当需要一个函数式接口的对象时,可以提供一个lambda表达式. package l ...

  3. Lambda01 编程范式、lambda表达式与匿名内部类、函数式接口、lambda表达式的写法

    1 编程范式 主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 1.1 命令式编程 关注计算机执行的步骤,就是告诉计算机先做什么后做什么 1.2 声明式编程 表达程序的执行逻辑,就是告诉计算 ...

  4. Java函数式编程:一、函数式接口,lambda表达式和方法引用

    Java函数式编程 什么是函数式编程 通过整合现有代码来产生新的功能,而不是从零开始编写所有内容,由此我们会得到更加可靠的代码,并获得更高的效率 我们可以这样理解:面向对象编程抽象数据,函数式编程抽象 ...

  5. Java8 学习笔记--函数式接口与lambda表达式的关系

    在java中,lambda表达式与函数式接口是不可分割的,都是结合起来使用的. 对于函数式接口,我们可以理解为只有一个抽象方法的接口,除此之外它和别的接口相比并没有什么特殊的地方.为了确保函数式接口的 ...

  6. Java 关于函数式接口与Lambda表达式之间的关系

    java是一种面向对象的语言,java中的一切都是对象,即数组,每个类创建的实例也是对象.在java中定义的函数或方法不可能完全独立,也不能将方法函数作为参数或返回值给实例. 在java7及以前,我们 ...

  7. Java8函数式编程以及Lambda表达式

    第一章 认识Java8以及函数式编程 尽管距离Java8发布已经过去7.8年的时间,但时至今日仍然有许多公司.项目停留在Java7甚至更早的版本.即使已经开始使用Java8的项目,大多数程序员也仍然采 ...

  8. Java8函数式编程和lambda表达式

    文章目录函数式编程JDK8接口新特性函数接口方法引用函数式编程函数式编程更多时候是一种编程的思维方式,是一种方法论.函数式与命令式编程区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉 ...

  9. 函数式接口和Lambda表达式

    函数式接口(一般标有@FunctionalInterface)就是只定义一个抽象方法的接口. 一个接口,如果满足函数式接口的定义,那么即使不标注为 @FunctionalInterface, 编译器依 ...

随机推荐

  1. 将EasyRTMP_RTSP移植到Android平台实现的RTSP拉流转推RTMP直播流功能

    本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/73253044 前言 安防互联网化的需求已经越 ...

  2. Android 框架学习3:从 EventBus 中学到的精华

    关联文章: EventBus 3.0 的特点与如何使用 源码分析 EventBus 3.0 如何实现事件总线 学习的目的是为了超越,经过前面对 EventBus 3.0 的学习,我们已经对它相当熟悉了 ...

  3. matlab save 命令

    有时候要运行很长才得到结果,而这部分结果在后面修改代码之后不需要改变.可以多次利用这些结果or参数,有必要将结果保存下来. 1 save example1 A ;%A为当前环境下的变量,example ...

  4. 类的析构方法__del__

    析构方法: 语法: class 类名: def __del__(self): ... 说明: 析构方法在对象被销毁时被自动调用 python建议不要在对象销毁时做任何事情,因为销毁的时间难以确定 cl ...

  5. Jmeter-JDBC Connection Configuration和JDBC Request注释

    1.JDBC Connection Configuration Variable Name--变量名,唯一值不可重复,给JDBC Request确定使用哪个配置 Max Number of Conne ...

  6. HDU4035 Maze(师傅逃亡系列•二)(循环型 经典的数学期望)

    When wake up, lxhgww find himself in a huge maze. The maze consisted by N rooms and tunnels connecti ...

  7. 每天一个linux命令(性能、优化):【转载】vmstat命令

    vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控.他是对系统的整体情况进行统计,不足之处是无法对某个进程进行深 ...

  8. BZOJ3489 A simple rmq problem 【可持久化树套树】*

    BZOJ3489 A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一 ...

  9. mysql拼接多条查询结果并且加序列

    SELECT GROUP_CONCAT(a.DESCRIPTION SEPARATOR '\n')     FROM (SELECT (@rowNum:=0) AS rowNo,CONCAT('公司内 ...

  10. 《DSP using MATLAB》示例 Example 6.25

    代码: % x = [-0.9, 0.81]; [y, L, B] = QCoeff(x, 3) % Unquantized parameters r = 0.9; theta = pi/3; a1 ...