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);
            }
        }
    }
}
相关推荐
白榆maple24 分钟前
(蓝桥杯C/C++)——基础算法(下)
算法
JSU_曾是此间年少29 分钟前
数据结构——线性表与链表
数据结构·c++·算法
此生只爱蛋1 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
咕咕吖2 小时前
对称二叉树(力扣101)
算法·leetcode·职场和发展
九圣残炎2 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
lulu_gh_yu3 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
丫头,冲鸭!!!3 小时前
B树(B-Tree)和B+树(B+ Tree)
笔记·算法
Re.不晚3 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
为什么这亚子4 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
4 小时前
开源竞争-数据驱动成长-11/05-大专生的思考
人工智能·笔记·学习·算法·机器学习