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

思考(如何按指定时间间隔完成工作,将这个工作放在一个ActionListener的actionPerformed方法中:)

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

想要反复执行这个代码,可以构造Worker类的一个实例,然后把这个实例提交到一个Timer对象。这里的重点是actionPerformed方法包含希望以后执行的代码。

思考(如何用一个定制比较器完成排序。想要按长度而不是默认的字典顺序对字符串排序对字符串排序,可以向sort方法传入一个Comparator对象:)

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

共同点:都是将一个代码块传递到某个对象(一个是定时器,或者一个sort方法)。这个代码快会在将来某个时间调用。

6.3.2 lambda表达式的语法

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

这是我看到的第一个lambda表达式,lambda表达式就是一个代码块,必须传入代码的变量规范。

--------带参数变量的表达式就被称为Lambda表达式。

-------------------------表达式形式,参数,箭头(->)以及一个表达式。如果代码要完成的计算无法放在一个表达式中,就把这些代码放在{}中,并包含显示的return语句。如:

(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(i); }

如果可以推导出lambda表达式的参数类型,则可以忽略其类型。如:

Comparator<String> comp
=(first,second)
->first.length()>second.length();

如果方法只有一个参数,而且这个参数的类型可以推导得出,那么还可以省略小括号;

ActionListener listener =event->
System.out.println("The time is "+new Data());

无需指定lambda表达式的返回类型。lambda表达式的返回类型总是会由上下文推导得出。如:

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

上面的可以在需要int类型结果的上下文中使用。

下例程序显示了如何在一个比较器和一个动作监听器中使用lambda表达式。

 package cc.openhome;
import java.awt.Toolkit;
import java.util.Arrays;
import java.util.Date;
import javax.swing.JOptionPane;
import javax.swing.Timer;
public class LambdaTest {
public static void main(String[] args) {
// TODO code application logic here
String[] planets =new String[] {"Yi","Er","San","Si","Wu","Liu","Qi","Ba"};
System.out.println(Arrays.toString(planets));
System.out.println("Sortd in dictionary order:");
Arrays.sort(planets);
System.out.println(Arrays.toString(planets));
System.out.println("Sorted by length:");
Arrays.sort(planets,(first,second) -> first.length()-second.length());
System.out.println(Arrays.toString(planets));
Timer t =new Timer (1000,event -> {System.out.println("The time is "+new Date());Toolkit.getDefaultToolkit().beep();});
t.start();
JOptionPane.showMessageDialog(null, "Quit programe?");
}
}
[Yi, Er, San, Si, Wu, Liu, Qi, Ba]
Sortd in dictionary order:
[Ba, Er, Liu, Qi, San, Si, Wu, Yi]
Sorted by length:
[Ba, Er, Qi, Si, Wu, Yi, Liu, San]
The time is Wed Mar 21 10:00:34 CST 2018
The time is Wed Mar 21 10:00:35 CST 2018
The time is Wed Mar 21 10:00:36 CST 2018
The time is Wed Mar 21 10:00:37 CST 2018
The time is Wed Mar 21 10:00:38 CST 2018
The time is Wed Mar 21 10:00:39 CST 2018
The time is Wed Mar 21 10:00:40 CST 2018
The time is Wed Mar 21 10:00:41 CST 2018
成功构建 (总时间: 8 秒)

run:

6.3 lambda 表达式的更多相关文章

  1. 你知道C#中的Lambda表达式的演化过程吗?

    那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...

  2. Linq表达式、Lambda表达式你更喜欢哪个?

    什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...

  3. 背后的故事之 - 快乐的Lambda表达式(一)

    快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...

  4. Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)

    作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...

  5. java8中lambda表达式的应用,以及一些泛型相关

    语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...

  6. 背后的故事之 - 快乐的Lambda表达式(二)

    快乐的Lambda表达式 上一篇 背后的故事之 - 快乐的Lambda表达式(一)我们由浅入深的分析了一下Lambda表达式.知道了它和委托以及普通方法的区别,并且通过测试对比他们之间的性能,然后我们 ...

  7. CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  8. Lambda 表达式递归用法实例

    注意: 使用Lambda表达式会增加额外开销,但却有时候又蛮方便的. Windows下查找子孙窗口实例: HWND FindDescendantWindows(HWND hWndParent, LPC ...

  9. Spark中Lambda表达式的变量作用域

    通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如: package java8test; public class T1 { public static void main( ...

  10. 释放Android的函数式能量(I):Kotlin语言的Lambda表达式

    原文标题:Unleash functional power on Android (I): Kotlin lambdas 原文链接:http://antonioleiva.com/operator-o ...

随机推荐

  1. Zeppelin推荐

    1.官网 Zeppelin官网,我们可以通过官网了解并获取Zeppelin,Zeppelin既有编译好可以直接运行的文件:也有源码文件. 官网下载网址 http://zeppelin.apache.o ...

  2. Flutter实战视频-移动电商-06.Dio基础_Get请求和动态组件协作

    博客地址: https://jspang.com/post/FlutterShop.html#toc-0ee 编写页面代码 创建动态组件HomePage,原来的代码是静态的我们这里就去掉就可以了. 然 ...

  3. Codeforces Round #374 (Div. 2)【A,B,C】

    = =C题这种DP打的少吧,记得以前最短路分层图打过这样子的,然后比赛前半个小时才恍然大雾...然后瞎几把还打错了,还好A,B手速快..上分了: A题: 计算B的连续个数的组数,每组的连续个数: 水题 ...

  4. tp5 验证器使用

    路径 app\admin\validate\User.php 如果没有则创建该文件夹和文件 User.php <?php namespace app\junyi\validate; use th ...

  5. [Xcode 实际操作]八、网络与多线程-(7)使用MessageUI框架,创建并发送一封带有附件的邮件

    目录:[Swift]Xcode实际操作 本文将演示如何使用MessageUI框架,创建并发送一封带有附件的邮件. 使用邮件编辑视图控制器(MFMailComposeViewController)实现邮 ...

  6. css 的继承性

    目录 css 的继承性是什么? 父元素的属性那些可以被子元素继承,哪些不能呢? css 的继承性是什么? 在面向对象语言都会存在继承的概念,在面向对象语言中,继承的特点:继承了父类的属性和方法. 那么 ...

  7. Android近场通信---NFC基础(二)(转)

    转自 http://blog.csdn.net/think_soft/article/details/8171256 应用程序如何调度NFC标签 当标签调度系统完成对NFC标签和它的标识信息封装的In ...

  8. StringUtils.split()和string.split()的区别

    场景 出于业务考虑,将多个字符串拼接起来时,使用的分隔符是;,;.如果要将这样一个拼接来的字符串分割成原本的多个字符串时,就需要使用到jdk自带的split()方法.不过因为公司的编程规范,改为使用了 ...

  9. 213. 打家劫舍 II

    你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在 ...

  10. redis 的操作

    redis Redis(Remote Dictionary Server)是一个开源使用的非关系型数据库 通常被称为数据结构服务器,因为值可以是字符串,哈希,列表,集合,有序集合 优势 ​ 性能极高, ...