函数式编程思想、Lambda表达式

函数式编程思想

函数式编程思想强调的是做什么,而不是以什么样的方式来做,忽略了面向对象的复杂语法,只要能够获取到结果,谁去做的,怎么做的,都不重要,重要的是结果,不重视过程。

冗余的Runnable代码

public class DemoRunnable{
   public static void main(String []args){
      //匿名内部类的方式
    new Thread(new Runnable(){
       @Override
       public void run(){
         System.out.println("开启了一天新线程");
         }
        }).start();  //启动线程
    }
}

代码分析:

  • Thread类需要Runnable接口作为参数,其中抽象方法run用来指定线程任务内容的核心。
  • 为了指定run方法的方法体,不得不需要Runnable接口的实现类。
  • 为了省去一个RunnableImpl实现类的麻烦,不得不使用匿名内部类。
  • 必须重写抽象方法run方法,方法名称,参数,返回值不得不在再一遍,且不能写错。
  • 从这里看出只有方法体才是线程任务的关键性内容。

我们真正希望做的事情是将run方法体内的代码传递给Thread类,让Thread类能够加载到。------传递一段代码是我们的真正的目的。

我们需要将程序开发的重点从怎么做 回归到做什么, 过程和形式并不重要。
2014年3月Oracle官方所发布的Java 8(JDK1.8)中加入了Lambda表达式新特性。


体验Lambda表达式的更优写法

public class DemoRunnable{
   public static void main(String []args){
     new Thread(()->{
       System.out.println("开启了新线程");
           }
        ).start();  //启动新线程
    }
}

从上面代码可以看出,我们没有创建接口实现类,不再有抽象方法覆盖重写的操作,只写了线程任务的内容。我们可以推导出Lambda表达式的语法。

() -> System.out.println("开启了新线程")
  • 前面的一对小括号即run方法,无参,里面的空的。
  • 中间的箭头代表将前面的参数传递给后面的代码。
  • 后面的输出语句即业务逻辑代码(线程任务)。

Lambda表达式的标准格式
格式有三部分组成:

  • 一些参数
  • 一个箭头
  • 一段代码
    Lambda表达式的标准格式:
(参数类型1 参数名称1,参数类型2 参数名称2...)-> {代码语句}

格式说明:

  • 小括号的语法与传统的方法参数列表一致,没有参数就不写。多个参数就用逗号隔开。
  • ->是新引入的动作,代表指向的动作。
  • 大括号内的语法与传统的方法要求基本一致。

Lambda表达式省略格式
可推导即可省略
Lambda强调的是做什么,而不是怎么做,凡是可根据上下文推导得知的信息,都可以省略。

//定义计算机接口,有一个抽象方法
public interface Calculator{
 double sum(double d1,double d2);
}
//定义测试类
public class Test{
   public static void main(String []args){
     //1. 传统方式使用匿名内部类
     invokeSum(3.14,3.15,new Calculator(){
        @Override
       public double sum(double d1,double d2){
          return d1+d2;
         }   
    });
     //2.使用Lambda表达式
     invokeSum(3.14,3.15,(double d1,double d2)->{
          return d1+d2;
    });
     //3.使用Lambda表达式的省略写法
     invokeSum(3.14,3.15,(d1,d2)->d1+d2);
 }

/*需要定义一个方法
参数传递两个double值,再传递一个接口
方法调用sum方法
*/
public static void invokeSum(double d1.double d2,Calculator calculator){
  double sum=calculator.sum(d1,d2);
      System.out.println(sum);  
    }
}

省略的规则:
1.小括号内参数的类型可省略。
2.如果小括号内有且仅有一个参数,则小括号可以省略。
3.如果大括号内有且仅有一条语句,则无论是否有返回值,都可以省略大括号,return关键字和语句的分号。


Lambda表达式使用的前提
Lambda的语法非常简洁,使用非常简单,但是有以下注意事项:

  • 使用Lambda表达式必须有接口,且要求接口当中有且仅有一个抽象方法,无论JDK内置的Runnable接口,Comparator接口,还是自定义的接口,只有当接口当中的抽象方法存在且唯一,才可以使用Lambda表达式。
  • 使用Lambda表达式必须具有上下文推断,也就是方法的参数或者局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。
    备注:有且仅有一个抽象方法的接口,称为函数式接口。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值