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);
            }
        }
    }
}
相关推荐
俎树振8 分钟前
深入理解与优化Java二维数组:从定义到性能提升的全面指南
java·算法
DARLING Zero two♡16 分钟前
【优选算法】Sliding-Chakra:滑动窗口的算法流(上)
java·开发语言·数据结构·c++·算法
❦丿多像灬笑话、℡19 分钟前
leetcode 热题100(208. 实现 Trie (前缀树))数组模拟c++
算法·leetcode·c#
hjxxlsx20 分钟前
二维数组综合
c++·算法
ylfmsn38 分钟前
线性回归背后的数学
算法·回归·线性回归
无名之逆1 小时前
lombok-macros
开发语言·windows·后端·算法·面试·rust·大学期末
yuanbenshidiaos1 小时前
C++-----图
开发语言·c++·算法
忘梓.1 小时前
解锁动态规划的奥秘:从零到精通的创新思维解析(4)
算法·动态规划
戊辰happy5 小时前
arcface
算法
浊酒南街6 小时前
决策树python实现代码1
python·算法·决策树