一.Lambda表达式
一种代码简洁又抽象的表达方式,它能够在一个方法要调用某个接口的抽象方法前,对其要调用的抽象方法实现重写.
1.Lambda使用条件
1.必须要保证它是某个接口中唯一的一个抽象方法.即:无法用于存在多个抽象方法的接口
如:
interface InterA{
void show();//Lambda表达式之 不带形参不带返回值的接口抽象方法
}
2.要有一个方法或一个对象/类的小括号’()'作为参数,让lambda的表达式填入其中.
如果是方法,则该方法必须同接口的抽象方法存在联系,比如该方法调用了接口的抽象方法
如:
public static void methodA(InterA a){
a.show();
}
Lambda标准格式:
方法名/对象名/new 类名((形参可选) -> {
//代码块(重写)
} );
列如:
methodB((String str)->{
System.out.println("methodB方法内,它用过'show'方法传递的字符串内容为:"+str);
System.out.println("这里,我们其实已经重写了show方法,但重写是重写代码块儿,而并非是连同形参内容也给重写了");
System.out.println("因此可以调用methodB方法中,给'show'传递的形参's'");
});
2.Lambda的省略格式
省略规则一:当重写方法块仅一行代码时,可以省略大括号’{}’,当无参数时,不可以省略小括号’()'
格式:方法名/对象名/new 类名(() -> //代码块);
列如:methodA(() -> System.out.println("因为只有一行代码,在使用lambda表达式重写并实现某个抽象方法时,可以省略大括号"));
省略规则二:如果参数只有一个,可以省略括号’()’,仅写参数名即可.
注意:当重写方法没有参数时,小括号’()'不能省略
格式:方法名/对象名/new 类名(唯一参数-> //代码块);
列如: methodB(s-> System.out.println("重写方法,并打印's'字符串形参的内容:"+s));
省略规则三:可以省略参数类型,只填写参数名或者是其对应的数据,
注意:不可以单独省略某个参数的类型,要么都省略掉类型,要么都不省略.
格式:方法名/对象名/new 类名((参数1,参数2)-> //代码块);
列如:methodC((a,b)-> System.out.println("方法形参a的数值为"+a+",b的数值为"+b+",总和为"+(a+b)));
省略规则三:如果方法有返回值,且只有一行代码因而想要省略’大括号’的话,那么需要省略 其’return’单词.
格式:方法名/对象名/new 类名((参数)-> //return代码块);
列如:methodD((a,b)-> a+b);
二.方法引用
比较晦涩难懂,其实是程序根据你需要重写的内容和需求,将其送给Object或其子类/实现类中能够实现相似作用的类去实现.
即:将一个需求抛给一个已经存在的解决方案,可以是此前你自己写的类和方法,也可以是jdk中已有的类和方法.
1.引用类的静态方法
格式:方法名/对象名/new 类名(已知类::其类中的静态方法);
列如:methodLoadB(Math::max);
2.引用对象的成员方法
步骤1/ new对象
格式:对象类名 自定义对象名 = 对象类名(参数可选);
列如:Student st = new Student();
步骤2 正式引用
格式:方法名/对象名/new 类名(自定义对象名::成员方法);
列如:objLoad(st::nameToAgeOfString);
3.引用类的动态方法
格式:方法名/对象名/new 类名(已知类::其中的动态方法);
列如:classLoad(String::substring);
4.引用构造器(了解)
如(Stream流例子):team.map(Student::new
).map(Student::toString
).forEach(System.out::println);
public class StreamStudent {
public static void main(String[] args) {
// 队伍1
ArrayList<String> team1 = new ArrayList<>();
team1.add("陈玄风");
team1.add("梅超风");
team1.add("风清扬");
team1.add("解风");
team1.add("风波恶");
team1.add("陆乘风");
team1.add("曲灵风");
team1.add("武眠风");
team1.add("冯默风");
team1.add("陆小风");
// 队伍2
ArrayList<String> team2 = new ArrayList<>();
team2.add("宋远桥");
team2.add("俞莲舟");
team2.add("俞岱岩");
team2.add("张松溪");
team2.add("张翠山");
team2.add("殷梨亭");
team2.add("莫声谷");
// 1、从第一个队伍中筛选出名字为3个字并且以“风”字结尾的人(Lambda表达式:返回名字长度为3,且后缀为风的字符串),筛选之后,只保留前6个。
// 2、从第二个队伍中筛选出姓张的人员,筛选之后,不要第一个。 3、将两个筛选结果合并为一个队伍。
// 4、将结果队伍中的字符串姓名作为Student对象的属性,创建Student对象,将集合中的元素都更改为Student类型。
// 5、打印结果队伍的Student对象信息
Stream<String> teamStreamOne = team1.stream().filter(s -> s.length() == 3 && s.endsWith("风")).limit(6);
Stream<String> teamStreamTwo = team2.stream().filter(s -> s.startsWith("张")).skip(1);
Stream<String> team = Stream.concat(teamStreamOne, teamStreamTwo);
team.map(Student::new).map(Student::toString).forEach(System.out::println);
}
}