翻译:GentlemanTsao,2020-06-24
下面是一个Java函数式接口示例:
public interface MyFunctionalInterface {
public void execute();
}
上面的代码被视为Java中的函数式接口,因为它仅包含一个方法,并且该方法没有实现。 通常,Java接口不包含其声明的方法的实现,但可以包含默认方法或静态方法的实现。 下面是Java函数式接口的另一个示例,其中包含一些方法的实现:
public interface MyFunctionalInterface2{
public void execute();
public default void print(String text) {
System.out.println(text);
}
public static void print(String text, PrintWriter writer) throws IOException {
writer.write(text);
}
}
上面的接口在Java中仍然算作函数式接口,因为它仅包含一个未实现的方法。
Java函数式接口可以通过Java Lambda 表达式实现。 下面的示例实现了函数式接口MyFunctionalInterface:
MyFunctionalInterface lambda = () -> {
System.out.println("Executing...");
}
Java lambda表达式根据Java接口实现单个方法。 为了知道lambda表达式实现的是哪个方法,该接口只能包含一个未实现的方法。 换句话说,该接口必须是Java函数式接口。
Java包含一组针对常见用例设计的函数式接口,因此你不必为每个小用例创建自己的函数式接口。 在以下各节中,我将描述Java中的一些内置函数式接口。
Java Function接口(java.util.function.Function)接口是Java中最核心的函数式接口之一。 Function接口表示接受单个参数并返回单个值的函数(方法)。如下是Function接口定义:
public interface Function<T,R> {
public <R> apply(T parameter);
}
除了上面列出的方法外,Function接口实际上还包含一些其他方法,但是由于它们都带有默认实现,因此你不必实现这些额外方法。 额外的方法将在后面的部分中说明。
你只需实现apply()方法。 如下是一个Function的实现示例:
public class AddThree implements Function<Long, Long> {
@Override
public Long apply(Long aLong) {
return aLong + 3;
}
}
此Function接口的实现实现了apply()方法,它将Long作为参数,并返回Long。 下面是使用上述AddThree类的示例:
Function<Long, Long> adder = new AddThree();
Long result = adder.apply((long) 4);
System.out.println("result = " + result);
你还可以使用Java Lambda表达式实现Function接口。 像这样:
Function<Long, Long> adder = (value) -> value + 3;
Long resultLambda = adder.apply((long) 8);
System.out.println("resultLambda = " + resultLambda);
如你所见,Function接口的实现现在内联在adder Lambda变量的声明中,而不是在单独的类中。 这样更简短,而且我们可以在上面的代码中直接看到它在做什么。
Java Predicate接口,即java.util.function.Predicate,表示一个简单函数,该函数以单个值作为参数,并返回true或false。如下是Predicate函数式接口定义:
public interface Predicate {
boolean test(T t);
}
Predicate接口不仅仅包含test()方法,但是其余方法是默认方法或静态方法,你不必实现这些方法。
您可以使用一个类来实现Predicate接口,如下所示:
public class CheckForNull implements Predicate {
@Override
public boolean test(Object o) {
return o != null;
}
}
你还可以使用Lambda表达式实现Java Predicate接口。 如下是一个使用Java lambda表达式实现Predicate接口的示例:
Predicate predicate = (value) -> value != null;
Predicate接口的lambda实现实际上与上述使用类的实现相同。
Java UnaryOperator接口表示一个操作,该操作接受单个参数并返回相同类型的参数。 如下是Java UnaryOperator实现的示例:
UnaryOperator<Person> unaryOperator =
(person) -> { person.name = "New Name"; return person; };
UnaryOperator接口可用于表示将特定对象作为参数,修改该对象并再次返回的操作(可能作为函数式流处理链的一部分)。
Java BinaryOperator接口表示一个接受两个参数并返回单个值的操作。 参数和返回类型必须是同一类型。
Java BinaryOperator接口在实现对两个相同类型的元素进行求和,减法,除法,乘法等并返回相同类型的第三个元素的函数时很有用。
如下是BinaryOperator接口的实现示例:
BinaryOperator<MyValue> binaryOperator =
(value1, value2) -> { value1.add(value2); return value1; };
Java Supplier接口是一个表示提供某种值的函数。 Supplier接口也可以视为工厂接口。如下是Java Supplier接口的实现示例:
Supplier<Integer> supplier = () -> new Integer((int) (Math.random() * 1000D));
此Java Supplier实现返回一个新的Integer实例,其随机值在0到1000之间。
Java Consumer接口是一个表示使用一个值而不返回任何值的函数。 Java Consumer实现可能是输出值,或将其写入文件,或写到网络等。如下是Java Consumer接口的实现示例:
Consumer<Integer> consumer = (value) -> System.out.println(value);
此Java Consumer实现将输入的参数的值打印到System.out。
下一篇:
Java函数式编程教程(四):Java函数式组合