Lambda表达式
如果你想把“一块代码”赋给一个Java变量,应该怎么做呢?
比如这个把下面这个代码块赋值给 aBlockOfCode
public void doSomeshit(String s){
System.out.println(s);
}
aBlockOfCode = public void doSomeshit(String s){
System.out.println(s);
}
在java 8之Lambda是做不到的。在java 8问世之后,利用Lambda特性,就可以做到,这个并不是很简洁的写法为了是这个赋值更加elegant我们可以移除一些没有的声明
1.移除public是多余的
2.dosomeShit函数名字也是多余的,因为已经赋给aBlockOfCode
3.void也可以移除,因为编译器可以自己判断返回类型是啥
4.Sting也可以移除编译器可以判断参数类型
5.只有一行可以不要大括号,但要在参数和函数之间加一个箭头符号 ->
这样,我们就成功的非常优雅的把“一块代码”赋给了一个变量。而“这块代码”,或者说“这个被赋给一个变量的函数”,就是一个Lambda表达式
aBlockOfCode = (s) ->System.out.println(s);
Lambda配合Optional<T>可以使Java对于null的处理变的异常优雅
Lambda表达式语法
package demo01;
/**
* @qvthor liuwenzheng
* @date 2021/5/12 9:17
*/
@FunctionalInterface//表面函数时编程
interface IMymessage{ //IMymessage 接口类型
void print();
}
public class TestDemo {
public static void main(String[] args) {
IMymessage message = () ->{
System.out.println("hello");
System.out.println("world");
System.out.println("hello world");
} ;
message.print();
}
}
方法的引用
引用静态方法:类名称::static 方法名
引用某个对象的方法:实例化对象::方法名
引用某个特定类的方法:类名称::普通方法
引用构造方法:类名称::new
package demo01;
//引用静态方法
/**
* @qvthor liuwenzheng
* @date 2021/5/12 9:34
*/
interface ImyMessage<P,R>{
R zhuanhuancanshu(P shili);
}
public class Test01 {
public static void main(String[] args) {
ImyMessage<Integer, String> message = String::valueOf;//进行方法引用
String str = message.zhuanhuancanshu(100); // 方法, 相当于调用了String.valueOf
System.out.println(str.length());
}
}
引用对象方法
String中的toUpperCase()方法为对象方法
package demo01;
//引用对象方法:String中的toUpperCase()方法为对象方法
import java.util.Locale;
/**
* @qvthor liuwenzheng
* @date 2021/5/12 10:01
*/
interface IMymessage2<R>{
R zhuangweidaxie();
}
public class Test2 {
public static void main(String[] args) {
IMymessage2 <String> shiili = "world"::toLowerCase;
System.out.println(shiili.zhuangweidaxie());
}
}
引用类中普通方法
String类中有一个compareTo方法,此方法为普通方法
package demo01;
//引用类中普通方法:String类中有一个compareTo方法,此方法为普通方法
/**
* @qvthor liuwenzheng
* @date 2021/5/12 10:06
*/
interface IMyMessage3<R,P>{
R compare(P canshu1, P canshu2);
}
public class Test3 {
public static void main(String[] args) {
IMyMessage3<Integer,String> shili = String::compareTo;
System.out.println(shili.compare("啊","吧"));
}
}
引用构造方法
package demo01;
/**
* @qvthor liuwenzheng
* @date 2021/5/12 10:16
*/
public class Preson {
private String name ;
private int age ;
public Preson(){
}
public Preson(String name,int age){
super();
this.age = age ;
this.name = name ;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
package demo01;
/**
* @qvthor liuwenzheng
* @date 2021/5/12 10:17
*/
interface IMyPreson<R,PN,PA>{
public R message(PN name ,PA age );
}
public class testPerson {
public static void main(String[] args) {
// Preson::new ;引用构造方法
IMyPreson <Preson,String,Integer> shili = Preson::new ;
System.out.println(shili.message("eLonMask",45));
}
}
package demo01;
/**
* @qvthor liuwenzheng
* @date 2021/5/12 9:10
*/
@FunctionalInterface//表明函数式编程
interface IMymessage1{ //接口
void print();
}
public class Demo01 {
public static void main(String[] args) {
IMymessage1 mymessage3 =()-> System.out.println("MyMessage");
mymessage3.print();
}
}
创建无参和有参函数
package demo01;
/**
* @qvthor liuwenzheng
* @date 2021/5/12 10:16
*/
public class Preson {
private String name ;
private int age ;
public Preson(){
}
public Preson(String name,int age){
super();
this.age = age ;
this.name = name ;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
内建函数式接口
Lambda的核心在于:函数式接口。而函数式接口的核心:只有一个抽象方法
java.util.function实际上函数式编程分为以下四种接口:
功能性函数式接口:public interface Function<R,T> R apply(T t);
供给型函数式接口: public interface Supplier T get();
消费型函数式接口:public interface Consumer void accept(T t);
断言型接口:public interface Predicate boolean test(T t);
功能性函数式接口:public interface Function<R,T> R apply(T t);
package demo01;
/**
* @qvthor liuwenzheng
* @date 2021/5/12 9:34
*/
interface ImyMessage<P,R>{
R zhuanhuancanshu(P shili);
}
public class Test01 {
public static void main(String[] args) {
ImyMessage<Integer, String> message = String::valueOf;//进行方法引用
String str = message.zhuanhuancanshu(100); // 方法, 相当于调用了String.valueOf
System.out.println(str.length());
}
}
供给型函数式接口: public interface Supplier T get();
package demo01;
import java.util.Locale;
/**
* @qvthor liuwenzheng
* @date 2021/5/12 10:01
*/
interface IMymessage2<R>{
R zhuangweidaxie();
}
public class Test2 {
public static void main(String[] args) {
IMymessage2 <String> shiili = "world"::toLowerCase;
System.out.println(shiili.zhuangweidaxie());
}
}