两者关系:

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. Okhttp之RealConnection建立链接简单分析

    在之前的博客中我们知道Okhttp在发起链接请求先从链接池中获取连接,如果链接池中没有链接则创建新的链接RealConnection对象,然后执行其connet方法打开SOCKET链接(详见< ...

  2. wordpress 生成自定义 meta box

    工具 https://jeremyhixon.com/tool/wordpress-meta-box-generator/ 使用 生成代码 /** * Generated by the WordPre ...

  3. 【集成学习】lightgbm使用案例

    github地址 #!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Sat Mar 31 21: ...

  4. TreeSet中自定义Comparator实现降序

    @Test public void test1() { TreeSet ts = new TreeSet<Integer>(new MyComparator()); ts.add(3); ...

  5. apply函数应用

    (1)找到数组中最小或最大的数字 var v = [1,23,4,9]; console.log(Math.min.apply(Math,v));

  6. SSH使用密钥登录并禁止密码登录

    #1 新建用于登录的用户useradd -p `echo "KYmO4ClPt1" | openssl passwd -1 -salt $(< /dev/urandom tr ...

  7. iOS 5 :一个UIPageViewController程序示例

    原文:http://www.techotopia.com/index.php/An_Example_iOS_5_iPhone_UIPageViewController_Application 在Xco ...

  8. for(j=0,i=0;j

    for(j=0,i=0;j<6,i<10;j++,i++) { k=i+j; } k 值最后是多少? <script type="text/javascript" ...

  9. 《selenium2 python 自动化测试实战》(10)——下拉框和alert

    # coding: utf-8 from selenium import webdriverfrom selenium.webdriver.common.action_chains import Ac ...

  10. direct2D图片处理

    转自:http://blog.csdn.net/augusdi/article/details/9040177  Using Bitmap Brushes Direct2D 中的图片处理增加了很多的灵 ...