广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java 函数编程详细介绍
  • 368
分享到

Java 函数编程详细介绍

2024-04-02 19:04:59 368人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、函数编程Lambda1、接口二、Java函数接口1、Predicate2、Consumer3、Function4、Supplier三、类型检查1、Capturing Lamb

前言:

函数式编程是一种编程范式,其中程序是通过应用和组合函数来构造的。它是一种声明式编程范式,其中函数定义是表达式树,每个表达式树返回一个值,而不是一系列改变程序状态的命令语句

Java8引入了Lambda形式的函数式编程。术语Lambda来自Lambda演算,用于描述计算。

一、函数编程Lambda

我们可以将lambda表达式视为一个匿名函数,可以将其分配给变量并传递给方法,该方法接受函数接口作为参数。Lambda表达式没有名称,但它有一个参数列表、一个主体和一个返回类型。

(parameters) -> expression

lambda表达式可以在函数接口的上下文中使用。

1、接口

函数接口是只指定一个抽象方法的接口。


public interface Comparator<T> {                           
    int compare(T o1, T o2);
}
public interface Runnable {                                
    void run();
}


Lambda表达式允许我们直接内联提供函数接口的抽象方法的实现,并将整个表达式视为函数接口的实例。

函数描述符:

我们将函数接口的抽象方法的签名称为函数描述符。函数描述符描述lambda表达式的签名。例如,我们可以将Runnable的函数描述符看作()->void,因为它有一个抽象方法,不接受任何内容,也不返回任何内容(void)。

二、Java函数接口

1、Predicate

Predicate<T>接口定义了一个名为test的抽象方法,该方法接受一个泛型类型为T的对象并返回一个布尔值。此接口可用于表示使用T类型对象的布尔表达式。

函数描述符: T->boolean


@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
}

2、Consumer

java.util.function.Consumer<T>接口定义了一个名为accept的抽象方法,该方法接受一个泛型类型为T的对象,并且不返回任何结果(void)。当我们需要访问T类型的对象并对其执行某些操作时,可以使用此接口。

函数描述符T->void

3、Function

java.util.function.function<T,R>接口定义了一个名为apply的抽象方法,该方法将一个泛型类型为T的对象作为输入,并返回一个泛型类型为R的对象。当我们需要定义一个lambda将信息从输入对象映射到输出时,可以使用该接口。

函数描述符T->R

4、Supplier

接口java.util.function.Supplier<T>定义了一个名为get的抽象方法,该方法不接受任何内容并返回类型为T的对象。

函数描述符()->R

Primitive Specializations

原语接口是专用接口,用于在输入或输出为原语时避免自动装箱操作。


public interface IntPredicate {
    boolean test(int t);
}

三、类型检查

lambda的类型是从使用lambda的上下文中推导出来的。上下文中lambda表达式所需的类型(例如,传递给它的方法参数或分配给它的局部变量)称为目标类型。Lambda表达式可以从赋值上下文、方法调用上下文(参数和返回)和强制转换上下文中获取其目标类型。


Object o = (Runnable) () -> System.out.println("Hello");

1、Capturing Lambda

lambda可以不受限制地捕获(在其主体中引用)实例变量和静态变量。但是当捕获局部变量时,它们必须显式地声明为final或实际上是final

我们为何有这个限制?

实例变量存储在堆上,而局部变量位于堆栈上。如果lambda可以直接访问局部变量,并且lambda在线程中使用,那么使用lambda的线程可以在分配变量的线程解除分配变量后尝试访问该变量。因此,Java将对自由局部变量的访问实现为对其副本的访问,而不是对原始变量的访问。如果局部变量只分配给一次,则这没有什么区别,因此存在限制。

四、方法引用

有三种主要的方法参考:

  •    对静态方法的方法引用。例如,–Integer::parseInt
  • 对任意类型的实例方法的方法引用。示例–String::length
  • 对现有对象或表达式的实例方法的方法引用。示例–student::getRank,其中student是具有方法getRankstudent类型的局部变量

List<String> list = Arrays.asList("a","b","A","B");
list.sort((s1, s2) -> s1.compareToIgnoreCase(s2));

可以写成


List<String> list = Arrays.asList("a","b","A","B");
list.sort(String::compareToIgnoreCase);

1、构造函数引用

可以使用ClassName::new引用现有构造函数

Supplier<List<String>> supplier = ArrayList::new;Supplier<List<String>> supplier = () -> new ArrayList<>()相同;

2、组合Lambda

许多函数接口包含可用于组合lambda表达式的默认方法。组合示例-

将两个谓词组合成一个较大的谓词,在两个谓词之间执行or操作
反向或链式比较器

3、Comparators

按逆序排列学生


Comparator<Student> c = Comparator.comparing(Student::getRank);
students.sort(comparing(Student::getRank).reversed()); 

根据姓名(反向)对学生进行排序,然后按反向顺序排列


students.sort(comparing(Student::getName).reversed()
        .thenComparing(Student::getRank)); 
Predicates


Predicates接口包括三个方法:negate, and, 和 or,可用于创建更复杂的谓词。


Predicate<Integer> naturalNumber = i -> i > 0;                                     
Predicate<Integer> naturalNumberLessThanHundred = naturalNumber.and( i -> i < 100);

4、Functions

函数接口带有两个默认方法,andThencompose

Consider f(x) = x2 and g(x) = x3 + 1 then

g(f(x)) ->


Function<Integer,Integer> square = n -> n*n;                         
Function<Integer,Integer> squareAndCube = square.andThen(n -> n*n*n+1);
System.out.println(squareAndCube.apply(2));  
65                        


f(g(x)) ->


Function<Integer,Integer> square = n -> n*n;                              
Function<Integer,Integer> squareAndCube = square.compose(n -> n*n*n + 1); 
System.out.println(squareAndCube.apply(2));                               

应用Lambda

让我们看看如何编写一个通用方法来根据veratain属性过滤一组书籍(将其视为sqlwhere子句)。


public static List<Book> filter(Predicate<Book> where) {                
  List<Book> books = Catalogue.books();                                 
  return books.stream().filter(where).collect(Collectors.toList());     
}                                                                       

Lambda表达式通过不同的过滤器过滤不同的书籍


List<Book> javaBook = filter(book -> book.getCateGory().equals(JAVA));               
List<Book> joshuaBlochBook = filter(book -> book.getAuthor().equals("Joshua Bloch"));

五、总结

lambda表达式可以被认为是一个匿名函数,可以在函数接口的上下文中使用。函数接口是只指定一个抽象方法的接口。

到此这篇关于Java函数式编程详情的文章就介绍到这了,更多相关Java函数式编程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java 函数编程详细介绍

本文链接: https://www.lsjlt.com/news/157520.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java 函数编程详细介绍
    目录一、函数编程Lambda1、接口二、Java函数接口1、Predicate2、Consumer3、Function4、Supplier三、类型检查1、Capturing Lamb...
    99+
    2022-11-12
  • Kotlin函数式编程超详细介绍
    目录1.函数式编程2.函数类别3.变换函数(transform)4.过滤函数(filter)5.合并函数(combine)1.函数式编程 我们都知道java是面向对象编程范式。在ja...
    99+
    2022-11-13
  • 详细介绍Java函数式接口
    目录Java—函数式接口1.自定义函数式接口1.1概述1.2格式1.3@FunctionalInterface注解1.4自定义函数式接口2.函数式编程2.1Lambda的延迟执行2....
    99+
    2022-11-12
  • JavaScript函数的详细介绍
    本篇内容主要讲解“JavaScript函数的详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript函数的详细介绍”吧!一、函数语法一个Jav...
    99+
    2022-10-19
  • Python Socket编程详细介绍
    在使用Python做socket编程时,由于需要使用阻塞(默认)的方式来读取数据流,此时对于数据的结束每次都需要自己处理,太麻烦。并且网上也没找到太好的封装,所以就自己写了个简单的封装。 封装思路 1....
    99+
    2022-06-04
    详细介绍 Python Socket
  • Python 循环函数详细介绍
    目录一、循环函数1、for循环2、while循环3、中断循环二、循环设计1、range()2、enumerate()3、zip()三、循环对象1、什么是循环对象2、迭代器3、生成器4...
    99+
    2022-11-12
  • KotlinExtensionFunction扩展函数详细介绍
    目录1 什么是扩展函数(Extension Function)2 为什么使用扩展函数(Extension Function)3 如何使用扩展函数(Extension Function...
    99+
    2023-02-17
    Kotlin Extension Function Kotlin扩展函数
  • JavaScript的function函数详细介绍
    通过函数来封装任意多条语句,而且可以在任何地方、任何时间调用执行。 而我们的JavaScript脚本语言比较特殊,相对于C语言,它的参数是不需要数据类型加持的。返回值return,...
    99+
    2022-11-12
  • 详细介绍VB编程中的数组
    在VB(Visual Basic)编程中,数组是一种特殊类型的变量,它用于存储多个相同类型的值。数组可以包含任意数量的元素,这些元素...
    99+
    2023-09-23
    VB
  • Python编程语言详细介绍
    目录一、语法1、缩进2、变量3、表达式4、类型5、方法二、 库1、Python的应用3、值得学习Python吗? 前言: Python是世界上最流行的解释型编程语言之一。Python...
    99+
    2022-11-12
  • 【JAVA IO 详细介绍】
    JAVA IO 详细介绍 目录一、什么是IO?1.1 IO的介绍1.2 流的介绍1.2.1 流的特征1.2.2 数据流的特征1.2.3 输入流的特征1.2.4 输出流的特征 二、...
    99+
    2023-10-26
    java
  • Java maven详细介绍
    目录maven什么是maven仓库的种类仓库的配置本地仓库配置私服配置中央仓库配置maven标准目录结构常用命令maven项目的生命周期pom.xml依赖适用域总结maven 什么是...
    99+
    2022-11-12
  • Kotlin扩展函数超详细介绍
    目录1.扩展函数2.infix 关键字3.扩展函数文件4.重命名扩展函数1.扩展函数 1)当我们没法接触某个类的定义,或者某个类没有用open修饰无法继承时,我们可以通过扩展函数,来...
    99+
    2022-11-13
  • MySQL之存储函数详细介绍
    目录1、创建存储函数2 、调用存储函数3、删除存储函数4、查看存储过程5、修改存储函数6、对比存储函数和存储过程7、练习题加强1、创建存储函数 语法格式: CREATE FUNC...
    99+
    2022-11-12
  • Python max内置函数详细介绍
    Python max内置函数 max(iterable, *[, key, default]) max(arg1, arg2, *args[, key]) Return the largest item i...
    99+
    2022-06-04
    详细介绍 函数 Python
  • Kotlin挂起函数的详细介绍
    Kotlin 协程的优势: 解决回调地狱的问题。以同步的方式完成异步任务。 示例: fun main() { runBlocking { val a = ge...
    99+
    2022-11-13
  • 详细介绍Golang的编译过程
    Golang 是 Google 开发的一种编程语言,自推出以来备受欢迎。多人协作、高并发、低延迟的特性,使得 Golang 非常适合用于互联网高流量服务端的开发。但是,作为一名 Golang 工程师,您是否对编译过程有所疑虑?本文将详细介绍...
    99+
    2023-05-14
  • PythonSocket编程知识点详细介绍
    目录一、导入Socket模块二、Socket基本用法1.建立一个简单的Socket连接2.协议对应端口3.Socket函数4.套接字函数5.一个简单的客户端与服务端交互三、总结前言:...
    99+
    2022-11-13
  • PHP Socket编程过程的详细介绍
    本篇内容主要讲解“PHP Socket编程过程的详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP Socket编程过程的详细介绍”吧!介绍Socket用于进程间通信。进程间通信通常基...
    99+
    2023-06-17
  • Java 方法(详细介绍)
    那么什么是方法呢?Java方法是语句的集合,它们在一起执行一个功能。 (推荐学习:java课程)方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点 使程序变得更...
    99+
    2017-06-19
    java教程 Java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作