什么是函数式接口?
通俗地说,一个函数式接口是其类型可作为方法参数,就像一个lambda表达式可作实际参数一样。例如,在集合中的forEach方法可以有以下特征:
forEach方法参数必须传入仅有一个方法的Consumer接口的一个实例。这个实例可能是一个lambda表达式(请参考(4)什么是lambda表达式的类型?),在这种情况下它可以替代该方法。一个Lambda表达式可以以这种方式替代仅含有一个方法的接口,所以若接口只有单一的一个方法,那么使用起来就无歧义。
更确切地说,一个函数式接口被定义为有且只有一个明确的声明为抽象方法的任何接口。 (该限定是必要的,因为一个接口可以有非抽象的默认方法)。这就是为什么函数式接口使用被称为一个抽象方法(SAM)的接口,仍然时不时会出现的一个术语。
例
根据上面的定义在类库中的下列接口都是函数式接口:
public interface Runnable { void run(); }
public interface Callable<V> { V call() throws Exception; }
public interface ActionListener { void actionPerformed(ActionEvent e); }
public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); }
语法注意事项:
1 接口Comparator 是一个函数式接口因为尽管它声明了两个抽象方法,但equals方法是从Object继承下来的公有方法。接口相比于Object的公有方法总是声明抽象的方法,但这通常是隐式的。无论是隐式或显式声明,这些方法都被排除在外
2【第一次读的时候跳过这条】当两个接口有不同的方法签名,但通过“擦除”相关,在这种情况下可能变得更加复杂。例如如下的两个接口的方法是等效覆盖的:
interface Foo1 { void bar(List<String> arg); }
interface Foo2 { void bar(List arg); }
如果一个接口的父接口包含等效覆盖的方法,该接口的函数描述符被定义为可以合法地覆盖所有继承的抽象方法的方法。在这个例子中,如果
interface Foo extends Foo1, Foo2 {}
那么 Foo 的函数:
void bar(List arg);
事实上,每一个函数式接口具有这样的函数描述符,尽管在更普遍,更简单的情况下,该接口仅仅有单一的抽象方法。
原文链接:http://www.lambdafaq.org/what-is-a-functional-interface/
分享到:
相关推荐
Lambda表达式必须与函数式接口关联,即具有一个抽象方法的接口。例如,`Runnable`接口就是一个常见的函数式接口,它的`run()`方法可以由lambda表达式实现。在上述示例中,`FuncInterface`也是一个自定义的函数式...
### Java:解锁Lambda表达式的魔法—从零开始的函数式编程之旅 #### 一、Lambda表达式...通过理解Lambda表达式的原理及其与函数式接口、流API的结合使用,我们可以更好地利用这一特性来编写高效、灵活的Java应用程序。
3. **函数式接口**与**Lambda 表达式**: Java 8 引入了 Lambda 表达式,这是一种简洁的语法糖,用于表示实现了单一抽象方法的匿名类。这种接口被称为函数式接口。例如: ```java public interface ...
Lambda表达式与函数式接口紧密相关。函数式接口是指只有一个抽象方法的接口。Java8提供了许多内置的函数式接口,如`Runnable`(无参无返回值)、`Function,R>`(接受一个类型T的参数,返回类型R的结果)等。 二、...
Java中的Lambda表达式和函数式接口是Java 8引入的重要特性,它们极大地简化了代码,尤其是在处理函数式编程场景时。下面将详细解释这两个概念及其应用。 **一、Lambda表达式** Lambda表达式是一种简洁的表示匿名...
Lambda表达式是Java编程语言中的一个关键特性,自Java 8开始引入,它极大地简化了函数式编程,尤其是在处理集合数据时。Lambda表达式的主要目的是为了创建匿名函数,即没有名字的函数,它可以被当作一个值传递给方法...
函数式接口是Lambda表达式的核心,因为它们提供了一个目标类型,使得Lambda表达式可以被赋值给该类型的变量。在Java 8之后,许多新的函数式接口被引入,如`Predicate`, `Function`, `Consumer`等,它们都是Stream ...
下面我们将详细探讨Lambda表达式的核心概念、使用场景、对接口的要求以及函数式接口。 1. **Lambda表达式的概念** Lambda表达式是一种简洁的语法,用于创建匿名函数。在Java中,它能够代替只包含一个抽象方法的...
适用人群 本源码资源适用于具备一定Java编程基础的开发人员和学习者。...2、函数式接口与Lambda表达式:学习如何使用Lambda表达式与不同类型的函数式接口进行交互,并了解如何通过Lambda表达式实现函数的传递和组合
Lambda表达式的引入,主要是为了支持Stream API和函数式接口的使用,从而提高了处理集合数据的效率。 Lambda表达式的基本语法格式如下: ```java (parameters) -> expression 或 (parameters) -> { statements; } `...
3. 使用函数式接口对Lambda表达式进行强制类型转换。 在实践中,我们可以使用Lambda表达式来创建函数式接口的实例,并使用这些实例来执行不同的操作。例如,我们可以使用Lambda表达式来创建Runnable接口的实例,并...
这些接口可以配合Lambda表达式进行函数式编程,实现更灵活的代码结构。 Lambda表达式还可以与Java 8的并行流(Parallel Stream)结合,利用多核处理器的优势进行并行计算,提高程序执行效率。例如: ```java long ...
函数式接口是指只有一个抽象方法的接口,例如 `java.util.function.Function` 和 `java.util.Comparator`。 3. **Lambda 实例** - 对于简单的操作,如求和,可以这样写: ```java BinaryOperator<Integer> add ...
即使是升级到JDK1.8了,但是很多开发者依然是停留在1.8之前的开发方式,使用的也是非常老旧和过时的API,遇到函数式接口也是依然使用匿名内部类解决。 本系列课程从Lambda表达式、方法的引用、Stream API三处着手...
它们可以赋值给任何函数式接口的引用,函数式接口是指仅包含一个抽象方法的接口,如 `Runnable`、`Comparator` 和 `Function` 等。 Java 8 中引入了几个重要的流(Stream)API,与 Lambda 表达式配合使用,可以实现...
Java 8 的 Lambda 表达式是其最显著的新特性之一,它引入了一种更为简洁、函数式的编程风格。Lambda 表达式使得处理匿名函数变得更加简单,尤其在需要定义短小、无状态的代码块时,它们可以极大提高代码的可读性和...
这些接口被称为函数式接口,例如`java.util.function.Function,R>`,`java.util.Comparator<T>`等。通过Lambda表达式,我们可以快速地创建这些接口的实例,而无需定义完整的匿名内部类。 下面是一些Lambda表达式的...
Lambda表达式是基于函数式接口实现的。函数式接口是指只有一个抽象方法的接口,它可以被用作Lambda表达式的类型。虽然任何有单一抽象方法的接口都可以作为Lambda的类型,但为了明确,Java 8引入了一个`@Functional...
Lambda表达式的语法基本格式为:(参数列表) -> { 函数体 }例如,下面是一个使用Lambda表达式实现函数式接口的示例:List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用Lambda表达式实现函数式接口 ...
Lambda表达式是Java 8引入的关键特性之一,它极大地简化了函数式编程,使得Java开发者能够更有效地处理并发问题,从而更好地利用现代计算机的多核处理器资源。 Lambda表达式的核心概念在于它的简洁性和可传递性。它...