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);
            }
        }
    }
}
相关推荐
海洲探索-Hydrovo4 小时前
TTP Aether X 天通透传模块丨国产自主可控大数据双向通讯定位模组
网络·人工智能·科技·算法·信息与通信
2401_841495647 小时前
【计算机视觉】基于复杂环境下的车牌识别
人工智能·python·算法·计算机视觉·去噪·车牌识别·字符识别
Jonkin-Ma7 小时前
每日算法(1)之单链表
算法
晚风残8 小时前
【C++ Primer】第六章:函数
开发语言·c++·算法·c++ primer
杨云强8 小时前
离散积分,相同表达式数组和公式
算法
地平线开发者8 小时前
征程 6 | BPU trace 简介与实操
算法·自动驾驶
满天星83035778 小时前
【C++】AVL树的模拟实现
开发语言·c++·算法·stl
Lris-KK9 小时前
力扣Hot100--94.二叉树的中序遍历、144.二叉树的前序遍历、145.二叉树的后序遍历
python·算法·leetcode
麦麦鸡腿堡9 小时前
Java的动态绑定机制(重要)
java·开发语言·算法
zy_destiny10 小时前
【工业场景】用YOLOv8实现抽烟识别
人工智能·python·算法·yolo·机器学习·计算机视觉·目标跟踪