Java 函数式编程和Lambda表达式

  1、Java 8最重要的新特性

  Lambda表达式、接口改进(默认方法)和批数据处理。

  2、函数式编程

  本质上来说,编程关注两个维度:数据和数据上的操作。

  面向对象的编程泛型强调让操作围绕数据,这样可以实现以类为单位的重用,当为类添加新的数据类型时,原有代码无需修改。

  函数式编程是一种不同的编程模型,它以操作(函数)为中心,强调变量不变性。函数式编程的准则是不依赖外部的数据,也不改变外部数据的值。这一特性满足了多核并行程序设计的需求,因此能简化并行程序开发。

  函数式编程用函数来表达所有的概念,完成所有的操作。面向对象编程中,把对象当作参数传递,而在函数式编程中,函数可以作为其他函数的参数传递,返回值也可以是函数。

  从开发者角度看,函数式编程不支持赋值操作,一个函数的执行只会返回一个值or函数,不会有任何副作用,所以看上去,一个函数就是一个大表达式。

  3、Lambda表达式使用场合

  Lambda表达式实现了函数式编程,能够让开发者将程序代码如同数据一样使用。方法可以被当作参数传递到其他方法内,如同对象实例或数。

  使用场合:通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。

  Lambda表达式可以用于替换广泛使用的内部匿名类实现回调功能,用于事件响应器。

  4、Lambda表达式语法

  Lambda表达式是一个能够作为参数传递的匿名函数对象,它没有名字,有参数列表、函数体、返回类型,也可以抛出异常。它的类型是函数接口(Functional Interface)。

  语法:  

  1)  形式参数:即参数列表,就是函数式接口里方法的参数。

  2) 向右的箭头(->):起分割作用。

  3)  方法体。表达式或者代码块,是函数式接口中方法的实现。(可以return返回值)

  

  5、什么是函数式接口

  函数式接口指仅包含一个抽象方法的接口。

  java.lang.Runnable、java.util.Comparator是典型的函数式接口

  

  6、函数式接口和Lambda表达式的联系

  Lambda表达式需要一个函数式接口作为其对应类型,而它的方法体就是函数接口的实现。每一个该接口类型的Lambda表达式都会被匹配到该接口的抽象方法。

  7、函数式接口的对象怎么创建

  • 标准方法创建;
  • 使用Lambda表达式创建。(可以简化代码)

    /*Lambda表达式创建函数式接口的对象*/
    interface Converter{
        Integer convert(String from);
    }
    Converter converter=(from)->Integer.valueOf(from);
    Integer integer=converter.convert(“123”);

  8、自动类型推到

  上面的代码中,编译器知道Converter只有一个方法convert(),所以convert()方法肯定对应表达式(from)->Integer.valueOf(from);

  由于convert()只有一个参数,所以from一定是String类型的。

  9、方法引用

  Lambda表达式到底意味着什么?任何一个Lambda表达式都可以被当作某个函数接口中的唯一抽象方法的匿名描述符。

  可以使用某个类的某个具体方法代表这个描述符,即为方法引用。这样,就无须绑定方法引用到某个实例,直接将实例作为功能接口的参数进行传递。

  方法的引用通过::符号来实现,方法引用被认为是和Lambda表达式一样的,可用于功能接口所适用的地方。

/*相当于让Converter接口的方法等价于Integer::valueOf()*/
Converter converter=Integer::valueof();
Integer integer=converter.convert(“123”);

  

  10、新特性——接口的默认方法(default)

  接口的默认方法是为了解决接口演化问题,即新版本中对接口进行修改,会导致早期版本的代码无法运行。因为接口中的方法必须被实现,若在接口中添加新方法,可能进行大量重构。所以,若往一个接口中添加新的方法,可以提供该方法的默认实现。

  有了默认方法,对已有的接口使用者来说,代码可以继续运行。新的代码可以继续使用该方法,也可以重写默认的实现。

interface Formula{
    double calculate(int a);
/*新增的方法,提供一个默认实现*/
    default double sqrt (int a) {
    return Math.sqrt(s);
    }
}

原文地址:https://www.cnblogs.com/bigbigbigo/p/8422579.html

时间: 2024-10-08 09:15:26

Java 函数式编程和Lambda表达式的相关文章

Java函数式编程和lambda表达式

为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于某种语法或调用API去进行编程.例如,我们现在需要从一组数字中,找出最小的那个数字,若使用用命令式编程实现这个需求的话,那么所编写的代码如下: public static void main(String[] args) { int[] nums = new int[]{1, 2, 3, 4, 5,

Java函数式编程(Lambda表达式)小记

函数式编程 函数式编程(Functional Programming)是编程范式的一种.最常见的编程范式是命令式编程(Impera Programming),比如面向过程.面向对象编程都属于命令式编程,大家用得最多.最熟悉.函数式编程并非近几年的新技术或新思维,其诞生已有50多年时间. 在函数式编程里面,一切都是数学函数.当然,函数式编程语言里也可以有对象,但这些对象是不可变的——要么是函数参数要么是返回值.函数式编程语言里没有for等循环,而是通过递归.把函数当成参数传递的方式实现循环效果.

[Java] 函数式编程相关概念 - 笔记1

Java 8 引入了 lambda 表达式,以及函数式编程风格.在了解函数式编程过程中,做了些笔记,摘录于本文. 嵌套函数( Nested Function ) 1. 嵌套函数,是指在另一个函数里面定义的一个函数.外层的函数,这里简称为外层函数. 2. 函数的嵌套可以是多层嵌套.嵌套函数可以看到其全部的外层函数的非局部变量.在实际程序中,嵌套的层数一般很少.下面是一个三层嵌套的例子, innerOfInner 也可以访问在 outer 函数体重定义的变量 x . function outer()

paip.提升效率---filter map reduce 的java 函数式编程实现

#paip.提升效率---filter map reduce 的java 函数式编程实现 ======================================================== #----------------------index索引------------------++函数式编程的优点儿以及缺点++actual code 实际代码例如以下---filter 实现...--- map 实现..---reduce---调用 ##函数式编程的优点儿以及缺点------

Java函数式编程原理以及应用

一. 函数式编程 Java8所有的新特性基本基于函数式编程的思想,函数式编程的带来,给Java注入了新鲜的活力. 下面来近距离观察一下函数式编程的几个特点: 函数可以作为变量.参数.返回值和数据类型. 基于表达式来替代方法的调用 函数无状态,可以并发和独立使用 函数无副作用,不会修改外部的变量 函数结果确定性:同样的输入,必然会有同样的结果. 下面jdk1.8里面对函数式编程的定义.只是一个  FunctionalInterface 接口.特别的简单. 1 @Documented 2 @Rete

Java8函数式接口以及lambda表达式实践

最近重新深入了解和学习了Java8的函数式接口以及lambda表达式,发现以前写的代码大多都是伪-函数表达式,因此重新精炼了一下的这部分代码,仅供参考,如有更好的方式,欢迎在评论区留言. 1.计算订单总金额 订单总金额一般是在后台循环叠加每个购买商品的金额已获取到,通常的方式如下 BigDecimal totalAmount = new BigDecimal(0); for (VenditionProduct venditionProduct : venditionVo.getVendition

Java核心技术-接口、lambda表达式与内部类

本章将主要介绍: 接口技术:主要用来描述类具有什么功能,而并不给出每个功能的具体实现.一个类可以实现一个或多个接口. lambda表达式:这是一种表示可以在将来的某个时间点执行的代码块的简洁方法. 内部类机制:内部类定义在另一个类的内部,其中的方法可以访问包含它们的外部类的域. 代理:一种实现任意接口的对象. 1 接口 1.1 接口的概念 概念:接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义. "如果类遵从某个特定的接口,那么就履行这项服务": Arrays

函数式编程之根-λ表达式(lambda expression)

学习函数式编程的大图(big map)/鸟瞰图,并在没有掌握Scheme的各种语言细节之前,给出Scheme代码.这意味着我们不需要看懂源代码,而是将这里的介绍作为后续学习的大图,使自己知道身在何处: 1930s初,普林斯顿大学的逻辑学家阿伦佐·丘奇 (Alonzo Church,1903-1995) 开发出了一种新的形式系统(formal system),即拉姆达运算/演算 (λ-calculus .lambda calculus ,lambda即希腊字母λ). λ运算的核心是λ表达式,以此形

Java 关于函数式接口与Lambda表达式之间的关系

java是一种面向对象的语言,java中的一切都是对象,即数组,每个类创建的实例也是对象.在java中定义的函数或方法不可能完全独立,也不能将方法函数作为参数或返回值给实例. 在java7及以前,我们一直都是通过匿名内部类把方法或函数当做参数传递,如下是一个线程实例. @Test public void testAnonymous() { new Thread(new Runnable() { @Override public void run() { System.out.println("匿