上一节里,介绍了一个函数接口:
java.util.function.Consumer除了Consumer之外,java.util.function 中还有很多其他的函数接口,从文件名可以看出,它们大致分为以下几类:
类别 | 描述 |
Consumer | 函数接受一些输入参数,但不提供返回值 |
Predicate | 谓词。函数接受一些参数,并返回一个true/false的值 |
Supplier | 供应者。函数不需要参数,并提供一个返回值 |
Operator | 函数需要一个或多个同类型的参数,并返回一个同类型的返回值 |
Function | 函数接受一些输入参数,并提供一个返回值 |
下面是一些例子.
一、BiFunction
首先看BiFunction的Doc说明:
Represents a function that accepts two arguments and produces a result
大意就是只要一个函数需要两个参数,并有返回值,则可以使用BiFunction代表。如下:
class Calculator<T, U, R>{ public R add(BiFunction<T, U, R> bc, T t, U u){ return bc.apply(t, u); } }
这里BiFunction代表函数引用,t和u代表要传入函数的两个参数,R表示返回值类型。可以如下使用函数引用调用:
Calculator<Integer, Integer, Integer> calculator = new Calculator<>(); Integer add = calculator.add(Math::addExact, 3, 5); System.out.println(add);
也可以使用Lambda表达式:
Calculator<Integer, Integer, Integer> calculator = new Calculator<>(); Integer add = calculator.add((n, m)->{return n+m;}, 3, 5); System.out.println(add);
这里n和m分别是函数需要的两个参数,3和5分别是传入的参数,参数类型由编译器推断。
二、Predicate
看Predicate的Doc说明:
Represents a predicate (boolean-valued function) of one argument
代表一个返回boolean值的,需要一个参数的谓词。
Predicate<Integer> p = n -> {return n>0;}; boolean test = p.test(4); System.out.println(test);
这里定义了一个用来判断一个数是不是正数的谓词。
三、自定义函数接口
可以自定义函数接口。任何一个只有一个未定义的方法的接口都可以认为是一个函数接口,例如:
interface PositiveNumber<T>{ boolean test(T a); }
可以如上面Predicate一样的使用,例如:
PositiveNumber<Integer> pn = n -> {return n>0;}; boolean isPositive = pn.test(4); System.err.println(isPositive);
通常,一个接口会加上注释@FunctionalInterface,用于表明当前接口是一个函数接口。@FunctionalInterface本身不是必须的,但是加上的一个好处就是通常IDE会有错误提示,如果一个接口中有多于一个示实现的方法,例如:
@FunctionalInterface interface PositiveNumber<T>{ boolean test(T a); boolean test2(T a); }
则IDE通常会显示一个错误。
相关推荐
《Scala函数式编程》是针对希望学习FP并将它应用于日常编码中的程序员而写的,内容包括:函数式编程的概念;函数式编程相关的各种“为什么”和“怎么做”;如何编写多核程序;练习和检测。 从OOP到FP,思路的转化 ...
Java 函数式编程教程 资源为视频教程资源 希望对你的 Java 学习有所帮助。
Java 8函数式编程学习笔记
Java8函数式编程超清学习
1. 学习函数式编程:通过阅读本源码资源,可以了解函数式编程的核心概念和在Java中的应用方式,为进一步学习函数式编程打下基础。 2. 实践函数式编程:本源码资源提供了丰富的函数式接口示例,帮助开发人员在实际...
java8 lambda 函数式接口 Stream流 并行流 Optional 方法引用
主要介绍了JAVA 函数式编程的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
那么,为什么函数式编程在Java中很危险呢?也许这个疑问普遍存在于很多程序员的脑中,作者Elliotte对此发表了一些见解,我们一起来看看他是怎么说的。 在我的日常工作中,我身边的开发者大多是毕业于CS编程院校...
函数式编程,这个词语由两个名词构成,函数,编程...函数,其实单独抽离出来这个词语,也并不陌生,那二者组合后的到底是什么呢,下面这篇文章主要给大家介绍了关于Java8函数式编程的相关资料,需要的朋友可以参考下。
一个简单的JavaScript函数式编程教程
引入Lambda表达式的作用是简化代码编写;函数接口的作用是让我们可以把函数包裹成函数接口,来实现把函数当做参数一样来使用(Java 不像 C 一样支持函数指针
函数式编程工作坊 ## 目标我们将通过一系列练习一起发现函数式编程。 我们将看到基本模式和相关的约束。 ## 约束 任何变量都必须是final 。 因此,禁止进行循环,因为它需要一个可更改的计数器。 禁止类继承,只...
Java函数式编程 课程大纲 ******* 课程大纲 ******* 了解函数式编程的基础知识-Lambda表达式,方法引用,流和函数接口。 for file in * ; do mv " ${file} " " ${file // - / } " ; done for file in * ; do mv " ...
公司常用到lamda表达式,有了这个资料,走遍天下都不怕
祖先-java8 通过浏览我的家谱来学习 Java 8 函数式编程。
1、函数式编程入门:通过阅读本源码资源,可以快速掌握Lambda表达式的基本语法和特性,为进一步学习函数式编程打下基础。 2、提高代码可读性:使用Lambda表达式可以减少样板代码,并使代码更加简洁和易读。本源码...
函数式编程的主要内容记住“该怎么办”? 将列表转换为流(与成员流中的每个成员做什么) 过滤器内部的含义(要过滤什么?) 使用方法参考的含义(执行什么?) (1)方法参考:-将列表转换为流(在列表中一一...
在Java中使用学习功能编程的自学练习。 #要求: 。 它不必是Oracle版本。 它可以是OpenJDK8 +或任何JDK 8或更高版本。 任何支持JUnit的东西都应该支持UncleJim。 文本编辑器或IDE #用法在这个专案上执行mvn clean ...
你厌烦函数式编程么?我也烦,我真想呼吁那些想我一样明智的人远离这种语言。 这里要澄清一点,我指的这种静态类型函数式编程语言,包括那种类型推断或者静态缺省等等。实际上,是Haskell和ML—family(包括...
4. 函数式编程:学习Java 8及更高版本引入的函数式编程特性,如Lambda表达式和Stream API,提升代码简洁性和可读性。 5. 设计模式:学习常见的设计模式,如单例模式、工厂模式、观察者模式等,了解如何应用设计模式...