Lambda表达式


Lambda表达式

前言

本文章带你全面的理解Lambda表达式以及使用,首先你需要了解利用行为参数化来传递代码有助于应对不断变化的需求。它允许你定一个代码块来表示一个行为,然后传递他。你可以决定在某一事件发生时(例如单击一个按钮)或在算法中的某一特定时刻(例如筛选算法中类似于“重量超过150克的苹果”的谓词,或者排序中的自定义比较操作)运行该代码块,利用这个概念,你就可以编写更为灵活且可重复使用的代码了。

Lambda管中窥豹

可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但他有参数列表、函数主体、返回类型,可能还有一个可以抛出异常列表。这个定义够大的,让我们慢慢道来。

  • 匿名-我们说匿名,是因为他不像普通的方法那样有一个明确的名称:写的少而且想的多
  • 函数-我们说他是匿名,是因为Lambda函数不像方法那样属于某个特定的类。但和方法一样,他有参数列表、函数主体、返回类型,可能还有一个可以抛出异常列表。
  • 传递-Lambda表达式可以作为参数传递给方法或存储在变量中。
  • 简洁-无需像匿名类那样写很多模版代码。

你是不是好奇Lambda这个词是从哪里来的?其实他是源于学术界开发出来的一套用来描述计算机的拉姆打演算法。你为什么应该关心Lambda表达式呢?在Java中传递代码十分繁琐和冗长。那么现在有了好消息!Lambda解决了这个问题:他可以让你十分简明的传递代码。理论上来说,你在Java8之前做不到的事,Lambda也做不了。但是现在你用不着再用匿名类写一堆笨重的代码,来体验行为参数化的好处了!Lambda表达式鼓励你采用行为参数化的风格。最终让代码变得更为清晰,更灵活。比如,利用Lambda表达式,你可以更为简洁的自定义一个Comparator对象。

<code>(Apple a1 , Apple a2)-> a1.getWeight().compareTo(a2.getWeight());/<code>

之前:

<code>Comparator<apple> byWeight = new Comparator<apple>(){public int compare(Apple a1 , Apple a2){  return a1.getWeight().compareTo(a2.getWeight());  }}/<apple>/<apple>/<code>

之后(用了Lambda表达式)

<code>Comparator<apple> byWeight = (Apple a1 , Apple a2) -> a1.getWeight().compareTo(a2.getWeight());/<apple>/<code>

不得不承认,代码看起来更清晰了!要是现在你觉得Lambda表达式看起来一头雾水的话也没关系,我们很快会一点点解释清楚的。现在,请注意你基本上只传递了比较两个苹果重量所真正需要的代码。看起来就像是只传递了Compare方法的主体。你很快就会学到,你甚至还可以进一步简化代码。我们将在下一节解释在哪里以及如何使用Lambda表达式。

我们刚刚展示的Lambda表达式有三个部分

  • 参数列表-这里采用了Comparator中的Compare方法的参数,两个Apple;
  • 箭头-箭头把参数与Lambda主体分隔开;
  • Lambda主体-比较两个Apple的重量。表达式就是Lambda的返回值了。

为了进一步说明,下面给出了Java 8 中五个有效的Lambda表达式例子。

<code>(String s) -> s.length()(Apple a) -> a.getWeight() > 150(int x , int y) -> {System.out.println("Result:");System.out.println(x + y);}() -> 42(Apple a1 , Apple a2) -> a1.getWeight().compareTo(a2.getWeight())/<code>

Java语言设计者选择这样的语法,是因为C#和Scala等语言中的类似功能广受欢迎,Lambda的基本语法是


<code>(parameters) -> expression(parameters) -> {statements}/<code>

你可以看到,Lambda表达式的语法很简单。

下一章将介绍Lambda表达式的使用场景以及如何使用。


分享到:


相關文章: