世界微尘里,吾宁爱与憎
lambda表达式
lambda表达式

lambda表达式

lambda表达式是一个可传递的代码块,可以在以后执行一次或多次

对于以下代码

Class Worker implements ActionListener
{
   public void actionPerformed(ActionEvent event)
  {
       //do some work
  }
}

在执行这个代码时,可以构造一个Worker类的一个实例,然后把这个实例提交到一个Timer对象

换个角度理解,Timer对象中的方法在执行时需要提供一个实现了ActionListener接口的类,Timer对象需要知道在时间间隔之后你需要执行的操作是什么,其实也就是ActionListener接口中actionPerformed这个方法中的内容

那么这里就存在一个问题,为什么不直接把这个方法,也就是actionPerformed那一段代码传递给Timer对象

实际上,到目前为止,在Java中传递一个代码段并不容易,你不能直接传递一个代码段,因为Java是一种面向对象语言,所以必须构造一个对象,然后再把包含在这个对象内的方法传递给你想要传递给的目标

这就导致了实际操作起来会异常的繁琐,但是,在其他的很多程序设计语言中,可以直接传递一段代码,而Java设计者却很长时间以来一直拒绝增加这个特性

终于,Java设计者在经历了多年的尝试以后,终于找到一种适合Java的设计,在jdl8中,lambda表达式模块应运而生

适用于lambda表达式的情况都具有一些共同点,都是将一个代码块传递到某个对象上,这个代码块会在将来某个时间调用

对于下列代码块,写出它的lambda表达式

class LengthCompartor implements Comparator<String>
{
   public int compare(Srting first,String second)
  {
       return first.length()-seond,length();
  }
}
Arrays,sort(strings,new LengthComparator());

首先我们要考虑需要传递的结果的是什么,这里是first.length()-second.length(),然后,需要考虑传入的参数是什么,这里是String first和String second,将它按这样的形式排列

(String first,String second)->first.length()-second.length()

这就是一个最简单的lambda表达式

当然,如果在一行内无法对参数进行全部的操作而得出结果,可以像构造方法那样将代码写到一个大括号内

(String first,String second)->
{
   if(first.length()<second.length()) return 1;
   else if(first.length()>second.length()) return -1;
   else return 0;
}

如果lambda表达式没有参数,仍要提供空括号

比如

()->{for (int i=100;i>=0;i++) System.out.println("1");}

如果可以推导出表达式的参数类型,可以省略参数类型,如果只有一个参数,可以省略小括号

lambda表达式就是一个代码块,以及必须传入代码的变量规范

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注