Lambda表达式&Stream流-函数式编程-java8函数式编程(Lambda表达式,Optional,Stream流)从入门到精通-最通俗易懂

一、函数式编程

1.1 概念

面向对象思想需要关注用什么对象完成什么事情。而函数式编程思想就类似于我们数学中的函数。它主要关注的是对数据进行了什么操作。

函数式编程是一种编程范式,它将计算视为函数的运算过程。函数式编程强调将程序分解成独立的、无状态的函数,避免使用可变的状态和共享的数据。函数式编程主要基于数学中的Lambda演算理论和一些数学函数的概念。

函数式编程具有以下特点:

  1. 纯函数:函数式编程中的函数是纯函数,即给定相同的输入,总是产生相同的输出,不会对外部状态产生任何影响。

  2. 不可变数据:函数式编程中的数据一旦创建就不会被修改,任何改变都是通过创建新的数据来实现。

  3. 高阶函数:函数可以作为参数传递给其他函数,也可以作为返回值返回。

  4. 递归:函数式编程中常使用递归来进行迭代和重复的操作。

  5. 引用透明:函数式编程中的函数调用可以被视为对表达式的求值,因此引用透明性是一个重要的特点,即可以替换函数调用的结果而不影响程序的行为。

1.2 优点

1.代码简洁,开发快速

2.接近自然语言,易于理解

3.易于"并发编程"

二、Lambda表达式

2.1 概念

  • lambda是JDK8中的一个语法糖,可以对某些匿名内部类的写法进行优化,让函数式编程只关注数据而不是对象。
  • 基本格式:(参数列表)->{代码}

Lambda可以对某些匿名内部类的写法进行简化,Lambda表达式只支持函数式接口。也就是只有一个抽象方法的接口。因此,可以对某些匿名内部类进行简化的条件是:

1.是一个接口的匿名内部类

2.这个接口中只有一个抽象方法。

当满足这两个条件,就可以使用Lambda对这个匿名内部类进行简化。

Lambda表达式是一种匿名函数,它可以简化对于单一方法接口(Single Abstract Method,SAM)的实现。

2.2 语法

(参数列表)->{代码}

2.3 案例

2.3.1 案例一

匿名内部类的写法

复制代码
public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("新线程的run()执行了!");
            }
        }).start();
    }

以上是还未被Lambda优化的一个匿名内部类,当使用Lambda优化过后,如下:

复制代码
public static void main(String[] args) {
        new Thread(() ->{
                System.out.println("新线程的run()执行了2!");
        }).start();
    }
2.3.2 案例二

匿名内部类的写法

复制代码
public class LambdaTest {
    public static void main(String[] args) {
//对printNum()方法进行调用
        LambdaTest.printNum(new IntPredicate() { //对接口的实现
            @Override
            public boolean test(int value) {  
                return value%2==0;
            }
        });
    }
 
//自定义一个printNum()方法
    public static void printNum(IntPredicate predicate){
        int[] arr={1,2,3,4,5,6,7,8,9,10};
        for (int i:arr){
            if(predicate.test(i)){
                System.out.println(i);
            }
        }
    }
}

采用Lambda表达式的

复制代码
public class LambdaTest {
    public static void main(String[] args) {
        LambdaTest.printNum((int value)-> {
                return value%2==0;
            }
        );
    }
 
     public static void printNum(IntPredicate predicate){
        int[] arr={1,2,3,4,5,6,7,8,9,10};
        for (int i:arr){
            if(predicate.test(i)){
                System.out.println(i);
            }
        }
    }
}
相关推荐
倒头就睡的小比特4 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼4 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光4 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark4 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her14 天前
并查集-听课笔记
笔记·算法·并查集
码流子4 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven4 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark4 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218614 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法