Java函数式编程——Lambda

函数式编程定义

函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。 和指令式编程相比,函数式编程强调函数的计算比指令的执行重要。和过程化编程相比,函数式编程里函数的计算可随时调用。——引自于百度百科函数式编程

Lambda表达式定义

Lambda表达式是一个匿名函数代码块,可作为表达式,方法参数和方法返回值。他所实现的匿名方法是在函数式接口中声明。

函数式接口

Lambda表达式实现的接口不是普通的接口,称为是函数式接口,这种接口只能有一个方法。为了防止在函数式接口中声明多个抽象方法,Java 8提供了一个声明函数式接口注释@FunctionalInterface代码如下:

package com.lambda_test1;
@FunctionalInterface
public interface Calculable {
    int calcuateInt(int a,int b);
}

Lambda表达式的标准语法形式

(参数列表)->{
//Lambda表达式
}

Lambda简化形式

省略参数类型

(a,b)->{
//Lambda表达式
}

省略参数小括号

这种方法只适合当参数只有一个时

a->{
//Lambda表达式
}

省略return和大括号

这种方法只适合表达式体中只有一条语句

a->a*a*a;

栗子

设计一个通用方法,能够实现两个数值的加法和减法运算
未使用Lambda表达式
package com.lambda_test1;
public interface Calculable {
    int calcuateInt(int a,int b);
}

package com.lambda_test1;

public  class HelloWorld  {

    public static Calculable calculable( char opr){
        Calculable result;
        if(opr=='+'){
            result= new Calculable() {
                @Override
                public int calcuateInt(int a, int b) {
                    return a + b;
                }
            };
        }else result = new Calculable() {
            @Override
            public int calcuateInt(int a, int b) {
                return a - b;
            }
        };
        return result;
    }
}

package com.lambda_test1;
public class main {
    public static void main(String[] args) {
        int n1=10;
        int n2=5;
        Calculable f1=HelloWorld.calculable('+');
        Calculable f2=HelloWorld.calculable('-');
        //调用calculateInt方法进行加法运算
        System.out.printf("%d+%d=%d\n",n1,n2,f1.calcuateInt(n1,n2));
        //调用calculateInt方法进行减法运算
        System.out.printf("%d-%d=%d\n",n1,n2,f2.calcuateInt(n1,n2));

    }

}

使用Lambda表达式进行重构
package com.lambda_test1;

public  class HelloWorld  {

    public static Calculable calculable( char opr){
        Calculable result;
        if(opr=='+'){
            result= (int a,int b)->{
                return a+b;
            };
        }else result =(int a,int b)->{
            return a-b;
        };
        return result;
    }
}

Lambda表达式做参数使用
package com.lambda_test1;
@FunctionalInterface
public interface Calculable {
    int calcuateInt(int a,int b);
}

package com.lambda.test2;

public class Main {
    public static void main(String[] args) {
        int n1 = 10;
        int n2 = 5;
// 打印计算结果加法计算结果
        display((a, b) -> {
            return a + b;
        }, n1, n2);
// 打印计算结果减法计算结果
        display((a, b) -> a - b, n1, n2);
    }

    /**
     * 打印计算结果
     *
     * @param calc Lambda表达式
     * @param n1   操作数1
     * @param n2   操作数2
     */
    public static void display(Calculable calc, int n1, int n2) {
        System.out.println(calc.calcuateInt(n1, n2));
    }
}



访问成员变量
package com.lambda.test2;

public class Main {
    // 实例成员变量
    private int value = 10;
    // 静态成员变量
    private static int staticValue = 5;
    // 静态方法,进行加法运算
    public static Calculable add() {
        Calculable result = (int a, int b) -> {
// 访问静态成员变量,不能访问实例成员变量
            staticValue++;
            int c = a + b + staticValue; // this.value;
            return c;
        };
        return result;
    }
    // 实例方法,进行减法运算
    public Calculable sub() {
        Calculable result = (int a, int b) -> {
// 访问静态成员变量和实例成员变量
            staticValue++;
            this.value++;
            int c = a - b - staticValue - this.value;
            return c;
        };
        return result;
    }
    
}



捕获局部变量
public class LambdaDemo {
// 实例成员变量
private int value = 10;
// 静态成员变量
private static int staticValue = 5;
// 静态方法,进行加法运算
public static Calculable add() {
//局部变量
int localValue = 20; 
Calculable result = (int a, int b) -> {
// localValue++; //编译错误 
int c = a + b + localValue; 
return c;
};
return result;
}
// 实例方法,进行减法运算
public Calculable sub() {
//final局部变量
final int localValue = 20; 
Calculable result = (int a, int b) -> {
int c = a - b - staticValue - this.value; 
// localValue = c; //编译错误 
return c;
};
return result;
}
}

使用Lambda创建线程

package com.it_51;

public class AnonymousClass {
    static Thread t1=new Thread(new Runnable() {
        @Override
        public void run() {

            System.out.println("线程的名字:"+Thread.currentThread().getName());
        }
    },"匿名类创建的线程");
    static Thread t2=new Thread(()->{
            System.out.println("线程的名字:"+Thread.currentThread().getName());
    },"Lambda表达式创建的线程");
    public static void main(String[] args) {
        t1.start();
        t2.start();
    }
}

总结

Lambda表达式代替匿名内部类,使代码更加清晰!不显得那么臃肿。其中Lambda表达式作为参数传递也是一种常见的用法,它还可以访问所在外层定义域内的成员变量和局部变量。当他访问局部变量时,把变量作为final的,在表达式内部可以修改它们的值。
点击链接加入群聊【程序员技术交流群】:添加链接描述

发布了84 篇原创文章 · 获赞 24 · 访问量 4337

猜你喜欢

转载自blog.csdn.net/qq_41827511/article/details/103180829