jdk在升级的过程中,让程序代码变得更加简洁。引入的lambda表达式,简明扼要的语法来表达某种功能所包含的操作,常用在程序遍历访问集合中元素的场合。
(以下内容引用文献:OCA JavaSE 8程序员认证考试指南 Exam 1Z0-808 第6章 6.6 使用简单的lambda表达式-OCA考点9.5)
一 、案例
1 新建Dog类
略
属性:昵称、年龄、重量
2 新建测试类
public class TestDogs {
public static void main(String[] args) {
ArrayList<Dog> dogs = new ArrayList<>();
dogs.add(new Dog("boi",30,6));
dogs.add(new Dog("charis",120,7));
dogs.add(new Dog("clover",35,12));
System.out.println("all dogs "+dogs);
//测试一 普通两个查询方法
System.out.println("min age 7 "+minAge(dogs,7));
System.out.println("max weight "+maxWeight(dogs,40));
//测试二 lambda测试(通用方法)
System.out.println("lam min age 7 "+dogQuerrier(dogs,d->d.getAge()>=7));
System.out.println("lam max weight "+dogQuerrier(dogs,f->f.getWeight()<40));
}
//第一步 两个查询方法
//查询年龄的方法
static ArrayList<Dog> minAge(ArrayList<Dog> dogList,int testFor){
ArrayList<Dog> result1 = new ArrayList<>();
for (Dog dog : dogList) {
if (dog.getAge() >=testFor ){
result1.add(dog);
}
}
return result1;
}
//查询体重的方法
static ArrayList<Dog> maxWeight(ArrayList<Dog> dogList,int testFor){
ArrayList<Dog> result2 = new ArrayList<>();
for (Dog dog : dogList) {
if (dog.getWeight() <= testFor){
result2.add(dog);
}
}
return result2;
}
//第二步 采用lambda 通用方法
static ArrayList<Dog> dogQuerrier(ArrayList<Dog> dogList, Predicate<Dog> expr){
//即时查询
ArrayList<Dog> lamRes = new ArrayList<>();
for (Dog dog : dogList) {
if (expr.test(dog)){
lamRes.add(dog);
}
}
return lamRes;
}
}
Predicate接口有一些新引进的static和default接口方法,最重要的是它有一个抽象方法test()方法,返回布尔值。
二、语法规则
import java.util.function.Predicate;
/**
- Predicate lambda详细语法规则
- 参数只能是变量名,或是后面跟变量名的类型,而且都在圆括号中
- 主体必须返回布尔值
- 主体可以是一个单一的表达式,这时不能包含return语句
- 主体可以是一个有花括号包围的代码块,其中可以包含一条或多条语句,每一条语句以分号结尾,代码块必须以return语句结尾
*/
public class LambDemo2 {
public static void main(String[] args) {
LambDemo2 lam1 = new LambDemo2();
//合法的lambda
lam1.go(x->7<5);
//lam1.go(y->10>5);
lam1.go((LambDemo2 z)->{int x = 2;return adder(2,7)>8;});
lam1.go(z->{int x = 2;return adder(2,7)>8;});
int a = 6;int b =5;
lam1.go(x->{return adder(a,b)>8;}); //局部变量
lam1.go(x->adder(a,b)>8); //无代码块
//非法的lambda
//lam1.go(x -> return adder(2,1) > 5;); // 返回w/o代码块
//lam1.go(LambDemo2 x -> adder(2,3) > 7); //类型需要圆括号
//lam1.go(()->adder(2,3)>7); //Predicate需要一个参数
//lam1.go(x ->{adder(2,3) > 9}); //代码块中需要的是语句
//lam1.go(x ->{adder(3,4) > 7;}); //需要return语句
}
void go(Predicate<LambDemo2> e){
LambDemo2 m2 = new LambDemo2();
System.out.println(e.test(m2)?"ternary true":"ternary false");
}
static int adder(int x,int y){
return x+y;
}
}
关于lambda表达式的知识,会在其他页面介绍。