函数式编程思想、Lambda表达式及实例

面向对象的思想 :
做一件事情 , 找一个能解决这个事情的对象 , 调用对象的方法 , 完成事情
函数式编程思想:
只要能获取到结果 , 谁去做的 , 怎么做的都不重要 , 重视的是结果 , 不重视过程
Java 8 JDK 1.8 )中,加入了 Lambda 表达 。借助Java 8 的全新语法, Runnable 接口的匿名内部类写法可以通过更简单的 Lambda 表达式达到等效。
 
Lambda 标准格式
Lambda 格式由 3 个部分 组成: 一些参数、一个箭头、一段代码
Lambda 表达式的 标准格式 为:
( 参数类型 参数名称 ) ‐> { 代码语句 }
 
格式说明:
       ():接口中抽象方法的参数列表,小括号内的语法与传统方法参数列表一致:无参数则留空;多个参数则用逗号分隔。
       ->:传递的意思,把参数传递给方法体{},是新引入的语法格式,代表指向动作。
       {}:重写接口的抽象方法的方法体,大括号内的语法与传统方法体要求基本一致。
 
public class lambda {
    public static void main(String[] args) {
        //匿名内部类,实现多线程
        new Thread(new Runnable(){
            //重写run方法,设置线程任务
            public void run(){
                System.out.println(Thread.currentThread().getName()+"hj"+i);
            }
        }).start();

        //lambda表达式,实现多线程
        new Thread(()->{
            System.out.println(Thread.currentThread().getName()+"hj"+i);
        }).start();
    }
}
/*
Lambda表达式有参数有返回值的练习
需求:
    给定一个计算器calculator接口,内含抽象方法calc可以将两个int数字相加得到和值
    使用Lambda的标准格式调用invokecalc方法,完成120和130的相加计算
*/
public interface calculator {
    public abstract int calc(int a,int b);
}
public class calcultormain {
    public static void main(String[] args) {
        //匿名内部类
        invokecalc(120, 130, new calculator() {
            @Override
            public int calc(int a, int b) {
                return a+b;
            }
        });

    //简化
    invokecalc(120, 130, (int a, int b)-> {
            return a+b;
        }
    );
}
    /*
    定义一个方法
    参数传递两个int类型的整数
    参数传递calculator接口
    方法内部调用calculator中的方法calc计算两个整数的和
     */
    public static void invokecalc(int a,int b,calculator c){
        int sum=c.calc(a,b);
        System.out.println(sum);
    }
}
Lambda 省略格式
可推导即可省略,凡是可以根据上下文推导出来的内容都可以省略
Lambda 强调的是 做什么 而不是 怎么做 ,所以凡是可以根据上下文推导得知的信息,都可以省略。例如上例还可
以使用 Lambda 的省略写法:
省略规则
Lambda 标准格式的基础上,使用省略写法的规则为:
1. 小括号内参数的类型可以省略;
2. 如果小括号内 有且仅有一个参数 ,则小括号可以省略;
3. 如果大括号内 有且仅有一个语句 ,则无论是否有返回值,都可以省略大括号、 return 关键字及语句分号(要省略一起省略)
    //简化
    invokecalc(120, 130, (int a, int b)-> {
            return a+b;
        }
    );

    //省略
    invokecalc(120, 130, ( a,  b)->  a+b);
Lambda 的使用前提
Lambda 的语法非常简洁,完全没有面向对象复杂的束缚。但是使用时有几个问题需要特别注意:
1. 使用 Lambda 必须具有接口,且要求 接口中有且仅有一个抽象方法
无论是 JDK 内置的 Runnable Comparator 接口还是自定义的接口,只有当接口中的抽象方法存在且唯一时,才可以使用Lambda
2. 使用 Lambda 必须具有 上下文推断
也就是方法的参数或局部变量类型必须为 Lambda 对应的接口类型,才能使用 Lambda 作为该接口的实例。
备注:有且仅有一个抽象方法的接口,称为 函数式接口

你可能感兴趣的:(函数式编程思想、Lambda表达式及实例)