我在Java 8中遇到了一个名为Functional Interface的新术语.
在使用lambda表达式时,我只能找到一个使用此接口的方法.
Java 8提供了一些内置的功能接口,如果我们想要定义任何功能接口,那么我们就可以使用@FunctionalInterface
注释.它允许我们在接口中只声明一个方法.
例如:
@FunctionalInterface
interface MathOperation {
int operation(int a, int b);
}
Run Code Online (Sandbox Code Playgroud)
除了使用lambda表达式之外,它在Java 8中有多大用处?
这里的问题与我提出的问题不同.在使用Lambda表达式时,它询问为什么我们需要功能接口.我的问题是:为什么使用功能接口而不是直接使用lambda表达式?
作为一名学习Java的非Java程序员,我正在阅读Supplier
和Consumer
接口.我无法围绕他们的用法和意义.您何时以及为何使用这些界面?有人可以给我一个简单的非专业人士的例子......我发现Doc的例子不够简洁,我的理解.
最近我开始探索Java 8,我无法理解Java功能实现lambda表达式所必需的"功能接口"的概念.有一个非常全面的 Java函数中的lambda函数指南,但我仍然坚持用于定义函数接口概念的章节.定义如下:
更确切地说,功能接口被定义为具有恰好一个抽象方法的任何接口.
然后他进入示例,其中一个是Comparator
界面:
Run Code Online (Sandbox Code Playgroud)public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); }
我能够测试我可以使用lambda函数代替Comparator参数,它可以工作(即Collections.sort(list, (a, b) -> a-b)
).
但是在Comparator接口中,两者compare
和equals
方法都是抽象的,这意味着它有两个抽象方法.那么如果定义要求接口只有一个抽象方法,那么它如何工作呢?我在这里错过了什么?
我认为这个问题已经存在,但我无法找到它.
我不明白,为什么有必要使用功能界面来处理lambdas.请考虑以下示例:
public class Test {
public static void main(String...args) {
TestInterface i = () -> System.out.println("Hans");
// i = (String a) -> System.out.println(a);
i.hans();
// i.hans("Hello");
}
}
public interface TestInterface {
public void hans();
// public void hans(String a);
}
Run Code Online (Sandbox Code Playgroud)
这没有问题,但如果您取消注释注释行,它不会.为什么?在我的理解中,编译器应该能够区分这两种方法,因为它们具有不同的输入参数.为什么我需要一个功能界面并炸毁我的代码?
编辑:链接重复项没有回答我的问题,因为我问的是不同的方法参数.但是我在这里得到了一些非常有用的答案,感谢所有帮助过的人!:)
编辑2:对不起,我显然不是母语人士,但为了准确自己:
public interface TestInterface {
public void hans(); //has no input parameters</br>
public void hans(String a); //has 1 input parameter, type String</br>
public void hans(String a, int b); //has 2 input parameters, 1. type = String, …
Run Code Online (Sandbox Code Playgroud) Java 8中功能接口的定义说:
功能性接口被定义为具有任何接口恰好 一个明确声明的抽象方法.(鉴定是必要的,因为接口可能具有非抽象的默认方法.)这就是为什么功能接口曾经被称为单抽象 方法(SAM)接口,这个术语有时仍然可见.
那么我们怎么会这样:
List<Double> temperature =
new ArrayList<Double>(Arrays.asList(new Double[] { 20.0, 22.0, 22.5 }));
temperature.sort((a, b) -> a > b ? -1 : 1);
Run Code Online (Sandbox Code Playgroud)
由于sort
方法List
是:
default void sort(Comparator<? super E> c) {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
ListIterator<E> i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
Run Code Online (Sandbox Code Playgroud)
lambda表达式说:
Lambda表达式应该可以分配给功能接口
该Comparator
接口有两个抽象方法,它们是compare
和equals
用它们注释的@FunctionalInterface
.这是否违反了只有一个抽象方法的功能接口的定义?