一.Lambda 表达式
Android Studio中可能会出现无法使用,提示说语言等级是7无法使用,Alt+Insert调用解决方法,重新编译。
1.概念
Lambda 表达式,也可称为闭包,允许把函数作为一个方法的参数。
2.重要特征
-
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
-
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
-
可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
-
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
3.Lambda表达式实例
// 1. 不需要参数,返回值为 5
() -> 5
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
4.注意
-
不能在 Lambda 内部修改定义在域外的局部变量
-
只能引用标记了 final 的外层局部变量
-
Lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)
-
在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。
5.Lambda运用实例
- 移除集合里面对象的值大于2的
Collection<Integer> collectionTemp1 = new ArrayList();
collectionTemp1.add(1);
collectionTemp1.add(2);
collectionTemp1.add(3);
collectionTemp1.removeIf(obj -> obj > 2);
System.out.println(collectionTemp1);
输出:[1, 2]
- 输出集合里面Person对象中年龄大于30和名字带有张的人数
public class Person {
String name;
int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
}
import java.util.ArrayList;
public class Test {
public static void main(String[] args){
ArrayList<Person> persons = new ArrayList<>();
String[] names = {"张明","张杰","李明浩","李浩天","李隆基","李世明"};
for (int i = 0; i < names.length; i++) {
Person person = new Person(names[i],i+30);
persons.add(person);
}
ShowTheResult.show(persons,lists -> {
int ageCount = 0;
int nameCount = 0;
for (Person people : lists) {
if (people.age > 30){
ageCount++;
}
if (people.name.contains("张")){
nameCount++;
}
}
System.out.println("名字里面含有张的人数是:"+nameCount+" "+"年龄超过30的人数是:"+ageCount);
});
}
}
interface Show{
void showTheCount(ArrayList<Person> T);
}
class ShowTheResult{
public static void show(ArrayList<Person> T,Show s){
s.showTheCount(T);
}
}
- 一般使用都是一个类中的某个方法中需要一个函数做参数,这个函数实现了某个接口,根据接口就可以写出对应的实现。
网友评论