package main.java.com.founder.study.lamada;
//Lambda表达式是一个匿名函数,Lambda是一段可以传递的代码(能够做到将代码像数据一样进行传递)。
/**
* Created by yan on 2020/7/22.
*/
public class App {
public static void main(String[] args) {
/**
* lambda 表达式的构成
* 1 声明 就是和lambda 表达式绑定的接口类型
* 2 参数 包含在一对圆括号中(),和绑定的接口方法的参数个数和顺序一致
* 3 操作符 ->
* 4 执行代码块 包含在一对大括号中{} ,出现在操作符的右侧
*/
// 没有参数没有返回值的 lambda 表达式
Ilambda ilambdaVoid = () ->{
System.out.println("ilambdaVoid 我是没有返回值没有参数的lambda");
};
ilambdaVoid.test();
//如果只有一行代码可以省略大括号
Ilambda ilambdaVoid2 = () -> System.out.println("我是没返回值和参数的");
ilambdaVoid2.test();
//带有参数但是没有返回值的 lambda 表达式
Ilambda2 ilambda2 = (String user,int age) -> {
System.out.println(user+age+"我是没有返回值有参数的");
};
ilambda2.test("张三",18);
// 可以省略参数类型,由jvm指定
Ilambda2 ilambda = (username,age) ->{
System.out.println(username+age+"参数类型可以省略的");
};
ilambda.test("lisi",19);
Ilambada3 ilambada3 = (x,y) -> {
int z = x + y;
return z;
};
System.out.println("有返回值的lambda"+ilambada3.test(1,2));
//当只有一行表达式的时候可以省略大括号和return
Ilambada3 ilambada31 = (x,y) -> x+y;
System.out.println("有返回值的省略returnlambda"+ilambada31.test(1,20));
/**
* 1 lambda表达式,必须和接口绑定
* 2 lambda表达式的参数,可以是0或者n个,参数类型不用指定,
* 3 lambda表达式的返回值,如果只有一行代码,并且没有大括号不用写 return 关键字,如果有{} 或者 多行代码要用return
*/
}
// 没有参数没有返回值的 lambda 表达式
interface Ilambda{
void test();
}
//带有参数但是没有返回值的 lambda 表达式
interface Ilambda2{
void test(String name, int age);
}
//带有参数和返回值的
interface Ilambada3{
int test(int x, int y );
}
}
方法的引用
是指如果某个方法签名和接口恰好一致,就可以直接传入方法引用。方法名可以不同,方法参数一致,返回类型相同。
使用Lambda表达式,我们就可以不必编写FunctionalInterface接口的实现类,从而简化代码:
Arrays.sort(array, (s1, s2) -> {
return s1.compareTo(s2);
});
public class Main {
public static void main(String[] args) {
String[] array = new String[] { "Apple", "Orange", "Banana", "Lemon" };
Arrays.sort(array, Main::cmp);
System.out.println(String.join(", ", array));
}
static int cmp(String s1, String s2) {
return s1.compareTo(s2);
}
}
除了可以引用静态方法和实例方法,我们还可以引用构造方法
public class Main {
public static void main(String[] args) {
List<String> names = List.of("Bob", "Alice", "Tim");
List<Person> persons = names.stream().map(Person::new).collect(Collectors.toList());
System.out.println(persons);
}
}
class Person {
String name;
public Person(String name) {
this.name = name;
}
public String toString() {
return "Person:" + this.name;
}
}