3.4.4、Lambda表达式

这篇Java教程基于JDK1.8。教程中的示例和实践不会使用未来发行版中的优化建议。
Lambda表达式

对于简单的匿名类来说,比如一个简单的接口只有唯一的方法,那么匿名类的语法看起来显得笨拙而不清楚。这时你可以把一个函数当做参数传递给方法,比如当有人点击按钮时应该触发什么动作。Lambda表达式就是这样,可以让你把函数当做参数,把代码当做数据。

在匿名类一节中,向你介绍了如何在不提供名字的基础上实现一个类。这通常比命名类更简洁,但是对于只有一个方法的类,即使是匿名类也显得有些多余和麻烦。Lambda表达式让你可以更简洁地表示单方法类的实例。

这一节包含下面这些主题:

Lambda表达式的理想用例

假设你创建了一个社交应用。你想增加一个特性,该特性能让管理员完成任何动作:比如在满足特定条件的社交网络成员中发送一条消息。下表描述了这个场景中的详细情况:

字段 描述
Name 在指定的成员上完成操作
Primary Actor 管理员
Preconditions 管理员已经登陆进入系统
Postconditions 动作只对符合指定条件的成员上执行完成
Main Success Scenario 1.管理员指定符合条件的成员
2.管理员指定要完成的动作
3.管理员触发提交动作
4.系统查找到所有符合条件的成员
5.系统在符合条件的成员上完成指定动作
Extensions 管理员可以选择在触发指定动作之前预览符合特定条件的成员
Frequency of Occurrence 一天之中会发生多次

假设社交应用中的成员用如下Person类来描述:

public class Person{
   
	public enum Sex{
   
		MALE,FEMALE
	}
	
	String name;
	LocalDate birthday;
	Sex gender;
	String emailAddress;
	
	public int getAge(){
   
		// ...
	}
	
	public void printPerson(){
   
		// ...
	}
}

假设社交应用中的成员存储在List<Person>实例中。

本节从这个用例的简单方法开始,接着通过使用局部类和匿名类来予以改进,最后再用高效和简洁的Lambda表达式来完成。

方法1:创建搜索匹配一个特征的成员的方法

最简单的就是创建多个方法,每个方法匹配一个特征,比如性别或者年龄。下面这个方法打印出比给定年龄大的成员。

public static void printPersonsOlderThan(List<Person> roster,int age){
   
	for(Person p : roster){
   
		if(p.getAge() > age){
   
			p.printPerson();
		}
	}
}
方法2:创建更通用的搜索方法

下面的方法相比printPersonsOlderThan更通用,它打印出指定年龄范围内的成员:

public static void printPersonsWithinAgeRange(List<Person> roster,int low,int high){
   
	for(Person p : roster){
   
		if(p.getAge() >= low && p.getAge() <= high){
   
			p.printPerson();
		}
	}
}
方法3:在局部类中指定搜索条件代码

下面的方法打印出符合指定条件的成员:

public static void printPersons(List<Person> roster,CheckPerson tester){
   
	for(Person p : roster){
   
		if(tester.test(p)){
   
			p.printPerson();
		}
	}
}

为实现特定的条件,你可以实现CheckPerson接口:

interface CheckPerson{
   
	boolean test(Person p);
}

如下的类实现了CheckPerson接口:

class CheckPersonEligibleForSelectiveService implements CheckPerson {
   
	public boolean test(Person p){
   
		return p.gender == Person.Sex.MALE
		&& p.getAge() >= 18 
		&& p.getAge() <= 25;
	}
}

为了使用该类,你可以在调用printPersons时创建一个该类的实例:

printPersons(roster,new CheckPersonEligibleForSelectiveService());
方法4:在匿名类中指定搜索条件代码
printPersons(roster,
			new CheckPerson
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值