Lambda表达式
来源:互联网 发布:单片机的资源 编辑:程序博客网 时间:2024/06/18 09:15
想学习好Lambda吗???
那么你就要知道Lambda表达式是什么???
Lambda的核心就是他是简化创建匿名类实例对象的
方法引用是简化Lambda的,也是一种Lambda的表现形式,只不过是更加简洁而已
Lambda和方法引用就是创建一个匿名内部类对象
他和匿名内部类还是有区别的
匿名内部类不用有实例变量或者局部变量所引用就可以创建对象而Lambda和方法引用必须得有实例变量或者局部变量所引用
否则不会创建对象成功的
/*
* Lambda表达式* Lambda表达式的结果类型称为Lambda表达式的目标类型。
* Lambda表达式的目标类型为函数式接口类型。确切的说,
* 目标类型是实现了函数式接口类型的对象。(该对象所属的类实现了函数式接口)
*
* 我们在某种情况下,可以使用Lambda表达式代替匿名类,这样,能够令程序
* 进一步简洁。
*
* 我们可以将Lambda表达式看成是一个匿名的方法。
* Lambda表达式的语法:
* (参数列表)-> {方法体}
* 1 参数列表的类型可以省略。
* 2 如果只有一个参数,小括号()可以省略。
* 3 如果方法具有返回值,并且方法体只有一条语句,则可以将return与{}同时省略。
* 4 如果方法没有返回值,并且方法体只有一条语句,则可以将{}省略。
*/
public class Lambda {
public Mobile getMobile() {
return new Mobile() {
@Override
public void call() {
System.out.println("匿名类打电话");
}
};
}
public Mobile getMobile2() {
return () -> System.out.println("Lambda打电话");
}
public void test() {
Generator g = new Generator() {
@Override
public int get(int x) {
return x + 2;
}
};
Generator g2 = x -> x + 2;
}
}
@FunctionalInterface
interface Generator {
int get(int x);
}
/*
* 方法引用
* 如果在Lambda表达式中,仅仅是调用一个已经存在的方法,那我们
* 就可以使用方法引用来代替Lambda表达式,通过方法引用可以让
* 程序进一步的简洁。
*
* 方法引用可以分为如下四种形式:
* 1 引用静态方法
* 2 通过对象(引用)引用实例方法
* 3 通过类型引用实例方法
* 4 引用构造器
*
* 方法引用是Lambda表达式的一种特例,也是返回实现了函数式接口类型的对象。
*/
public class MethodReference {
public static void main(String[] args) {
Person a = new Person("张三", 23, 120, 30);
Person b = new Person("李四", 25, 130, 40);
Friend f = (p1, p2) -> Person.mkFriend(p1, p2);
// f.makeFriend(a, b);
// 引用静态方法,抽象方法中的参数会依次传递给所引用的静态方法。
f = Person::mkFriend;
f.makeFriend(a, b);
Tool tool = new Tool();
f = (p1, p2) -> tool.mkFriend(p1, p2);
// 通过引用(对象)引用实例方法,抽象方法中的参数会依次传递给所引用的实例方法。
f = tool::mkFriend;
f = (p1, p2) -> p1.mkFriend2(p2);
// 通过类型引用实例方法。第1个参数充当所引用方法的调用者,从2个参数开始(一直到最后),
// 会依次传递给所引用的方法。
f = Person::mkFriend2;
Create c = (name, age, height, weight) -> new Person(name, age, height, weight);
// 引用构造器。抽象方法中的参数会依次传递给构造器。
c = Person::new;
}
}
@FunctionalInterface
interface Friend {
void makeFriend(Person p1, Person p2);
}
@FunctionalInterface
interface Create {
Person get(String name, int age, int height, int weight);
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
// MengMengDa m1 = new MengMengDa() {
//
// @Override
// public int mengmengda(People p1, People p2) {
// p1.say(p2);
// return 0;
// }
// };
// m1.mengmengda(new People(1, "111", "你好"), new People(0,"000","喜欢???......"));
//
//-----------------------------------------------------------------------------------//
//Test2
//MengMengDa m2 =(p1,p2)->{p1.say(p2);return 0;};
// m2.mengmengda(new People(1, "111", "你好"), new People(0,"000","喜欢???......"));
// m2.mengmengda(People::new, People::new);
//Test3
//Haha haha = (a,b)->{new People(a,b,"");};
// haha = People::new;//The type People does not define People(int, String) that is applicable here
//Haha haha = (a,b,c)->{new People(a,b,c);};
//编译器检查 People::new是作为接口的匿名内部类方法体中的方法语句
//编译期会检查方法的参数是否能够使语句能够顺利执行,方法的参数会依次传递给 People::new
//参数传递多了不能用,传递少了也不能用
//haha = People::new;
MengMengDa m =(p1,p2)->{
p1.say(p2);
MengMengDa mm = People::say;
};
//m2.mengmengda(new People(1, "111", "你好"), new People(0,"000","喜欢???......"));
MengMengDa m2 = People::say;
m2.mengmengda(new People(1, "111", "你好"), new People(0,"000","喜欢???......"));
}
}
@FunctionalInterface
interface MengMengDa{
void mengmengda(People p1 , People p2);
}
@FunctionalInterface
interface Haha{
void haha(int a ,String b ,String c);
}
class People{
private int age ;
private String name ;
private String line ;
public People(int age ,String name ,String line){
this.age = age ;
this.name = name ;
this.line =line ;
}
public void say(People p2){
p2.love();
}
public void love() {
System.out.println(line);
}
@Override
public String toString() {
return "name: "+name+" age: "+age ;
}
}
- Lambda Expressions(Lambda表达式)
- Lambda表达式
- Lambda表达式
- Lambda 表达式
- Lambda表达式
- lambda表达式
- lambda表达式
- Lambda表达式
- Lambda表达式
- Lambda表达式
- Lambda表达式
- Lambda 表达式
- Lambda表达式
- Lambda 表达式
- Lambda 表达式
- Lambda表达式
- Lambda表达式
- Lambda 表达式
- python在文本开头插入一行
- javaweb学习总结(七)——HttpServletResponse对象(一)
- Java之oracle数据库连接和MySQL数据库连接
- Windows 记事本的 ANSI、Unicode、UTF-8 这三种编码模式有什么区别?
- 判断带环链表相交的点
- Lambda表达式
- HDU1176-基础dp-免费馅饼
- NYOJ 47-过河问题(贪心)
- 75道程序员面试逻辑思维题
- C语言中static关键字的作用
- 关于oracle数据库解锁
- MySql权限有哪些?
- 模板介绍
- ssm+bootstrap+angularjs练习