JavaRush /Java 博客 /Random-ZH /喝咖啡休息#182。Java 中的函数式接口

喝咖啡休息#182。Java 中的函数式接口

已在 Random-ZH 群组中发布
来源:DZone 以下是 Java 函数式接口的概述:目的、示例、lambda 表达式和预定义接口列表。 喝咖啡休息#182。 Java 中的函数式接口 - 1作为一种面向对象的编程语言,Java以前无法拥有独立的功能,因为该语言中除了一些原始数据类型和方法之外,一切都是围绕类和对象展开的。然而,Java 8 引入了一个称为函数式接口的新概念,还引入了一些其他功能,如 Lambda 表达式、Time API、Stream API 等。这些功能接口是什么以及如何定义它们?让我们来看看吧!

什么是接口?

接口是一组确定系统元素交互的规则。它也被称为包含抽象方法和静态常量的类的轮廓。接口可以包含一个或多个抽象方法。接口还允许您指定类的要求,即类需要哪些方法。简而言之,接口就像每个实现类都必须遵守的契约。这是一个例子:
Interface A1
{
void method1();
String method2(String X);
}

Class A1 implements A
{
@Override
public void method1(){}
@Override
public String method2(String X) { return x; }
}
如果实现该接口的类没有声明该接口的所有方法,则代码将不会运行并会生成错误:“错误:A1 不是抽象的,并且不会重写 A1 中的抽象方法。(错误:A1不是抽象的,不会重写A1中的抽象方法)。在JDK 8之前,接口不能定义实现,但现在可以为接口方法添加默认实现。我们还可以定义静态方法和默认方法,这接口中无需对象即可调用 接口主要用于实现代码中的多重继承和松散耦合。现在我们对接口有了清晰的认识,下面我们来看看什么是函数式接口以及它是如何工作的。

什么是函数式接口?

函数式接口也称为单一抽象方法 (SAM) 接口。顾名思义,它最多可以有一个抽象方法。函数式接口可以有多个带有实现的静态方法和默认方法,以及一个附加的抽象方法。要将接口标记为函数式接口,可以使用@FunctionalInterface注释。需要避免错误地声明附加方法。函数式接口之所以如此受欢迎,是因为它能够使用 lambda 表达式创建接口,而无需使用匿名且繁琐的类实现。在函数接口中使用abstract关键字是可选的,因为接口中定义的方法默认是抽象的。

什么是 lambda 表达式?

lambda 表达式是一种未命名或匿名方法,它不会自行执行,但用于实现函数式接口的某些方法。它的定义如下:
(parameter list) -> lambda body
您在代码中看到的箭头运算符 ( -> ) 称为 lambda 运算符。例如,如果我们有以下方法:
double getGoldenRatioValue() {
return 1.61803;
}
使用 lambda 表达式,我们可以这样写:
() -> 1.61803
正如你所看到的,lambda函数中的方法没有参数,因此语句的左侧是空的。由于右侧决定操作,因此在本例中它将返回黄金比例的值:1.61803。在 Java 8 之前,实现接口或创建内部类对象至关重要,但在 Java 8 中,我们现在需要做的就是将 lambda 表达式分配给函数式接口。

功能接口示例

要创建函数式接口,您可以使用@FunctionalInterface注释或使用Java的预定义函数式接口。

实施例1

  • 首先,我们将标记@FunctionalInterface并创建一个名为MyInterface的接口,该接口由抽象getGoldenRationValue()方法调用。
  • 然后我们将创建一个公共类main来执行该方法。
  • 要在函数式接口中使用 lambda 表达式,我们将声明对MyInterfaceDemo 的引用,然后将 lambda 表达式分配给该引用。
  • 最后,我们将使用参考接口打印出黄金比例值。
import java.lang.FunctionalInterface;

// Creation и маркировка функционального интерфейса
@FunctionalInterface

interface MyInterface {
// Это абстрактный метод
double getGoldenRatioValue();
}

public class Main {
public static void main( String[] args ) {

//декларируем ссылку на функциональный интерфейс
MyInterface ref;
//используем Lambda Expression
ref = () -> 1.61803;

System.out.println("Value of Golden Ratio = " + ref.getGoldenRatioValue());
}
}
结论:
黄金比例值 = 1.61803

实施例2

  • 在此示例中,我们将使用预定义的函数接口ToDoubleFunction,它接受T参数并返回双精度值作为输出。
  • ToDoubleFuntion包含一个名为applyasDouble()的抽象方法。
  • 最后,我们打印消息的整个长度,包括空格。
import java.util.function.ToDoubleFunction;
public class MyInterface2 {

public static void main(String[] args) {

ToDoubleFunction<String> length = x -> x.length();

System.out.println(length.applyAsDouble("This is an example of predefined functional interface."));
}
}
结论:
54.0

预装功能接口列表

现在我们知道了如何定义函数式接口,让我们看看有多少预定义(内置)函数式接口。函数式接口主要有 4 种类型,可以在不同的情况下实现:ConsumerPredicateFunctionSupplier。在这四个接口中,ConsumerFunctionPredicate还有额外的函数接口。以下是 Java 中所有内置或预定义接口的列表。 笔记。下表中的T、U、R分别代表运算的第一个参数(T)、第二个参数(U)和结果(R)的类型。
界面 类型
可运行
双消费者(T, U) T、U →
双函数(T、U、R) T、U → R
二元运算符 T,T <→ R
双谓词<T, U> T、U → 布尔值
布尔供应商 → 布尔值
消费者 T →
双二元运算符 双,双→双
双重消费者 双 →
双功能 双→R
双谓词 双精度 → 布尔值
双供应商 布尔值 →
DoubleToInt 函数 双精度 → 整数
DoubleToLong 函数 双→长
双一元运算符 双→双
函数<T, R> 右→右
整数二元运算符 整数 → 整数
国际消费者 整数 →
整数函数 整数 → R
内部谓词 整数 → 布尔值
国际供应商 → 整数
整数转双精度函数 整数 → 双精度
IntToLong函数 整型 → 长整型
整型一元运算符 整数 → 整数
长二元运算符 长长→长
长消费者 长→
长函数 长 → R
长谓词 长→
长供应商 → 长
长到双功能 长→双
LongToInt函数 长→整数
长一元运算符 长→长
对象双消费者 T,双 →
ObjIntConsumer T,整数 →
对象长消费者 T,长 →
谓词 T → 布尔值
供应商 →T
ToDoubleBiFunction<T, U> T、U → 双
至双功能 T → 双
ToIntBiFunction<T, U> T、U → 整数
ToInt函数 T → 整数
ToLongBiFunction<T, U> T、U → 长
长函数 T → 长
一元运算符 时间 → 时间

让我们总结一下

从这篇文章中需要记住的一些关键要点:
  • 接口作为一种抽象机制工作。
  • 函数式接口可以有多个带有实现的静态方法和默认方法,以及一个附加的抽象方法。
  • 默认情况下,函数式接口中定义的方法是抽象的,因此不再需要使用abstract关键字。
  • lambda 表达式是一种匿名方法,它本身不执行,但用于实现函数式接口的某些方法。
  • 要创建函数式接口,您可以使用@FunctionalInterface注释或使用Java的预定义函数式接口。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION