java se8如何使用_Java SE8:Lambda快速入门

本篇为译文。

一、概览

目标

该教程介绍Java8平台中新的lambda表达式。

耗时

大约1小时

介绍

Lambda表达式是Java se8中一个新增的,并且是它重要特征。它们使用一个表达式,提供了一种清晰和简洁的方式来表示仅有一个方法的接口。Lambda表达式同时还改进了集合类库,使它更加容易使用,从一个集合中进行遍历、过滤、提取数据。另外,在处理器环境中,新的并发特性提高了系统性能。

Oracle的这个例子,提对Java se8中lambda表达式进行介绍。包含了匿名内部方法(anonymous inner functions)介绍,还包含了函数接口和新lambda语法介绍。最后,lambda表达式通用使用模式的例子将提供给大家。

下一部分回顾了一个通用查询使用例子和使用lambda表达式包含的部分来改进Java代码。另外,一些通用的函数接口,java.util.function包中提供的Predicate和Function接口,也在例子中展现。

在OBE的最后一部分中,回顾已经使用lambda表达式更新过的Java集合。

所有例子中的源代码都将会提供给你。

硬件和软件要求

下面列出所需硬件和软件:

JDK8

NetBeans 7.4

前提条件

为了运行这些例子,你必须有能够使用的jdk8和NetBeans7.4或者更高版本的。可以在the main Lambda site链接里查找。为了让你更加方便使用,下面是直接的链接。

jdk 8获取 jdk8

NetBeans 7.4或者更高版 netbeans

二、背景

1.匿名内部类

在Java中,匿名内部类提供了一种方式来实现那些在应用中进一次使用的类。例如,在标准的Swing或者JavaFX应用,需要包含键盘和鼠标的许多处理事件。代替分别给每个事件写处理类,你可以使用如下情况:

JButton testButton = new JButton("test Button");

testBUtton.addActionListerner(new ActionListener(){

@Override public void actionPerformed(ActionEvent ae){

System.out.println("Click Detected by Anon Class");

}

});

否则,对于每个事件,都需要有独立的实现了接口ActionListerner的类。通过在需要的地方创建类,这种代码使得更加容易读一些。但是这代码并不够简洁,因为仅仅定义一个方法需要许多代码。

2.函数接口

接口ActionListerner的定义如下:

package java.awt.event;

import java.util.EventListerner;

public interface ActionListener extends EventListener{

public void actionPerformed(ActionEvent e);

}

ActionListener是一个只有一个方法的接口,Java se8中,满足一下条件的接口被称为函数接口。

备注: 这种类型的接口,只有一个抽象方法(SIngle Abstract Method type)。

在Java中,匿名内部类使用函数接口比较多的一种模式。除了EventListener 类,像Runnable和Comparator接口都使用类似的方式。因此,函数接口在使用lambda表达式中比较通用。

3.Lambda表达式语法

Lambda表达式通过将5行代码转成一个单独的语句来处理匿名内部类的笨重问题。这个简单水平答案解决了内部类呈现出来的垂直问题。

一个Lambda表达式由三部分组成。

参数列表

箭头标识

主体

(int x,int y)

->

x+y

主体可以是一个单独的表达式或者块。上面的例子中,主体是简单的求值并返回。在块中,主体类似一个方法体,需要return语句返回来控制匿名方法的调用。关键字break和continue在顶级中是不合法的,但是循环中是被允许使用的。如果主体产生了一个结果,每一个控制路径必须返回或者抛出异常。

看看如下例子:

(int x, int y) -> x + y;

() -> 42;

(String s) -> { System.out.println(s);}

第一个表达式传递了两个整形参数,名字为x和y,并使用x+y方式来返回结果值。第二个表达式没有参数并使用表达式返回一个整形值42。第三个表达式产地一个字符串,并使用块形式来将该参数打印到控制台,同时不返回结果。

通过上面的语法,现在我们来看一些例子。

三、Lambda例子

1.Runnable Lambda

以下使用Lambda表达式来写Runnable。

public class RunnableTest{

public static void main(String[] args){

System.out.println("===Runnable Test ====");

//Anonymous Runnable

Runnable r1 = new Runnable(){

@Override

public void run(){

System.out.println("Hello world one!");

}

};

//Lambda Runnable

Runnable r2 = () -> System.out.println("Hello world two!");

r1.run();

r2.run();

}

}

在两个例子中,注意没有传递参数和返回值。

Runnable lambda表达式,使用块,将5行代码转成一行。

2.Comparator Lambda

在Java中,Comparator类被用于集合排序。在下面的例子中,ArrayList包含Person对象,基于surName排序。

public class Person{

private string givenName;

private String surName;

private int age;

private Gender gender;

private string eMail;

private String phone;

private String address;

}

以下例子使用匿名内部类和一些lambda表达式

public class ComparatorTest{

publibc static void main(String[] args){

List personList = Person.createShortList();

//sort with inner class

Collections.sort(personList,new Comparator(){

public int compare(Person p1,Person p2){

return p1.getSurName().compareTo(p2.getSurName);

}

});

System.out.println("===sorted asc surName==");

for(Person p:personList){

p.printName();

}

//use Lambda instead

System.out.println("==sorted asc surName===");

Collections.sort(personList,(Person p1,Person p2)->getSurName().compare(p2.getSurName()));

for(Person p:personList){

p.printName();

}

//print desc

}

}

3.Listener Lambda

4.资源

四、使用Lambda表达式改进代码

五、java.util.function包

六、Lambda表达式和集合

七、总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值