java8之lambda表达式(函数式接口)

在Java中有许多已有的接口都需要封装代码块,例如:Runnable或者Comparator。lambda表达式与这些接口是向后兼容的。对于只包含一个抽象方法的接口,你可以通过lambda表达式来创建该接口的对象,这种接口被称为函数式接口。注意:Java8中接口可以声明非抽象的方法。

为了演示函数式接口转换,我们以Arrays.sort方法为例。该方法的第二个参数需要一个Comparator接口(该接口只含有一个方法)的实例。接下来我们编写一个简单的lambda表达式:

Arrays.sort(words,(first,second) -> Integer.compare(first.length(),second.length()));

在这个表达式背后,Arrays.sort方法会接收一个实现了Comparaotr<String>接口的类的实例。调用该对象的compare方法会执行lambda表达式中的代码。这些对象和类的管理完全依赖于如何实现,因此比传统的内部类效率更高。你最好将一个lambda表达式想象成一个函数,而不是一个对象,并记住它可以被转换为一个函数式接口。

事实上,函数式接口的转换是你在java中使用lambda表达式能做的唯一一件事。在其他支持函数文本的编程语言中,你可以声明像(String,String) -> int这样的函数类型,声明这种类型的变量,并使用这些变量来保存函数表达式。但是,java设计者们还是决定坚持使用熟悉的接口概念,而没有将函数类型添加到java中。

Java API在java.util.function包中定义了许多非常通用的函数式接口(后面blog会进行详细讲解)。其中接口BiFunction<T,U,R>描述了T和U类型的方法参数以及返回类型R。你可以将我们的字符串比较lambda表达式保存在一个该类型的变量中:

BiFunction<String,String,Integer> comp = 
    (first,second) -> Integer.compare(first.length(),second.length());

但是,这对排序并不能起到什么帮助作用。不存在接收BiFunction作为参数的Arrays.sort方法。如果你之前使用过其他函数式编程语言,你可能会对此感到奇怪。但是对于Java开发人员来说,这再自然不过了。像Comparator这样的接口有着特定的目的,而不仅仅是一个接收参数和返回类型的方法。Java8保留了这一习惯。当你希望使用lambda表达式时,你仍然要牢记表达式的目的,并为它指定一个函数式接口。

现在java8本身的API使用了java.util.function中的接口,将来这些接口很可能被应用在各个地方。但是请记住,任何一个lambda表达式都可以等价转换成现在所使用的API中对应的函数式接口。

注意:你可以在任意函数式接口上标注@FunctionalInterface注解,这样做有两个好处。首先,编译器会检查标注该注解的实体,检查它是否是只包含一个抽象方法的接口。另外,在javadoc页面也会包含一条声明,说明这个接口是一个函数式接口。该注解并不要求强制使用。从概念上来讲,所有只含有一个抽象方法的接口都是函数式接口,但是使用@FunctionalInterface注解会让你代码看上去更清楚。

最后,当一个lambda表达式被转换为一个函数式接口的实例时,请注意处理检查期异常。如果lambda表达式中可能会抛出一个检查期异常,那么该异常需要在目标接口的抽象方法中进行声明。例如,以下表达式会产生一个错误:

//错误:Thread.sleep可以抛出一个检查期的InterruptedException
Runnable sleeper = () -> {System.out.println("Zzz");Thread.sleep(1000);};

由于Runnable.run不能抛出任何异常,所以这个赋值是不合法的。有两种方法可以修正该问题。一种是在lambda表达式中捕获异常,另一种是将lambda表达式赋值给一个其抽象方法可以抛出异常的接口。例如,Callable接口的call方法可以抛出任何异常。

时间: 2024-10-25 20:17:52

java8之lambda表达式(函数式接口)的相关文章

java8之lambda表达式(接口中的静态方法)

在Java8中,你可以为接口添加静态方法.从技术角度来说,这是完全合法的.只是它看起来违反了接口作为一个抽象定义的理念. 至今为止, 我们经常在相互一起使用的类中使用静态方法.你可以在标准库中找到像Collection/Collections或者Path/Paths这样成对的接口和类.以Paths类为例,它只有一些工厂方法.你可以通过一组字符串来构造一个路径,例如Paths.get("jdk1.8.0","jre","bin").在java8中,

java8之lambda表达式

lambda表达式是java8提供了一个比较重要的新特性之一,简化了很多代码的编写. 1.先看一个简单的例子,不是用lambda表达式创建一个线程: Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("hello world"); } }); 在Thread构造函数内传入一个Runnable接口的实现类. 2.再看一下使用lambda表达式创建线程的例

Android Stutio中使用java8的Lambda表达式

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51532028 本文出自:[openXu的博客] 目录: 为什么要使用Lambda表达式 让Android Stutio支持Lambda 函数式接口Functional interfaces Lambda表达式的目标类型以及匹配 Lambda表达式语法 1 基础语法和语法简化 2 Lambda表达式的词法作用域 3 变量捕获 ??Java 8的一个大亮点是引入Lambda表达式,使用它设计的

Java8 之 lambda 表达式、方法引用、函数式接口、默认方式、静态方法

今天我来聊聊 Java8 的一些新的特性,确实 Java8 的新特性的出现,给开发者带来了非常大的便利,可能刚刚开始的时候会有点不习惯的这种写法,但是,当你真正的熟悉了之后,你一定会爱上这些新的特性的,这篇文章就来聊聊这些新特性. lambda 表达式 lambda 表达式在项目中也是用到了,这种新的语法的加入,对于使用 Java 多年的我,我觉得是如虎添翼的感觉哈,这种新的语法,大大的改善了以前的 Java 的代码,变得更加的简洁,我觉得这也是为什么 Java8 能够很快的流行起来的原因吧.

java8之lambda表达式(方法引用)

有些时候,你想要传递给其他代码的操作已经有实现的方法了.示例: button.setOnAction(event -> System.out.println(event); 如果你能够只将println方法传递给setOnAction方法,就更好了!下面是改后的代码: button.setOnAction(System.out::println); 表达式System.out::println是一个方法引用,等同于lambda表达式: x -> System.out.println(x) 正如

java8之lambda表达式(1)-基本语法

参考:http://www.cnblogs.com/andywithu/p/7344507.html lambda表达式,即带有参数的表达式,为更清晰地理解lambda表达式,先看如下例子: (1) class Student{ private String name; private Double score; public Student(String name, Double score) { this.name = name; this.score = score; } public S

JAVA8之lambda表达式详解,及stream中的lambda使用

原文:http://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解 一.问题 1.什么是lambda表达式? 2.lambda表达式用来干什么的? 3.lambda表达式的优缺点? 4.lambda表达式的使用场景? 5.lambda只是一个语法糖吗? 二.概念 lambda表达式是JAVA8中提供的一种新的特性,它支持Java也能进行简单的"函数式编程". 它是一个匿名函数,Lambda表达式基于数学中的λ演算

java8之lambda表达式入门

1.基本介绍 lambda表达式,即带有参数的表达式,为了更清晰地理解lambda表达式,先上代码: 1.1 两种方式的对比 1.1.1 方式1-匿名内部类 class Student{ private String name; private Double score; public Student(String name, Double score) { this.name = name; this.score = score; } public String getName() { ret

java8之lambda表达式看这一篇就够了

java8增加了许多新特性,其中lambda表达式可以说为最重要的特性之一,本文将从如下几个方面来学习lambda:     1.lambda表达式的基本定义   2.lambda表达式的语法   3.lambda表达式基本示例 一.何为lambda表达式? 简单点说lambda为一种匿名函数,它既没有名字也没有声明的方法.访问修饰符和返回值等.它允许将函数作为方法的参数进行传递. 二.基本语法:lambda通常包含如下几种书写方式 () -> expression () -> {  stat