前言

  今天讲一下这个困惑我很久的Lambda。为什么这么说呢?因为我之前一直没主动去学过Lambda。很多使用Lambda表达式的代码我都没有仔细去琢磨咋回事。但是最近这个Lambda表达式出现的有些频繁,有点影响我接下来的学习了,于是我就去学了一下。我也是刚学完就来总结了,也算是巩固一下。当然我也希望这篇文章能帮到更多准备学Lambda同学。
  这篇文章我会用很多通俗易懂的例子来教大家如何使用Lambda,建议大家自己也敲一遍案例,这样印象才会更加深刻!!
ps:本文中使用的所有例子为 一个接口,下面对应的Lambda实现 以及精简后的Lambda实现

Lambda表达式

使用须知

  Lambda表达式虽然可以对接口进行简单的实现,但是这些接口必须只有一个抽象方法!!。这里有个注解我给大家说明一下:@FunctionalInterface这个注解是用在接口上面(修饰函数式接口),一旦使用了这个注解,那么这个接口中只能有一个抽象的方法。

基础语法和语法精简

():用来描述参数列表
 {}:用来描述方法体 有时可以省略
 ->: Lambda运算符 读作 goes to
  • 无参无返回类型接口的实现(方法大括号精简)
/**
*函数式接口
*/
@FunctionalInterface//修饰函数式接口(接口中的抽象方法只能有一个)
public interface NoneReturnNoneParmeter {
    void test();
}
--------------------------------------------------------------
//使用Lambda表达式实现接口:
NoneReturnNoneParmeter lambda1=()->{
            System.out.println("hello word");
        };
--------------------------------------------------------------
//精简Lambda表达式:
/**
* 方法大括号精简:
* 如果方法体中只有一条语句,此时大括号可以省略
*/
NoneReturnNoneParmeter lambda1=()->System.out.println("hello word");
  • 有返回值、一个参数的接口(小括号的精简、大括号精简的补充)
/**
*函数式接口
*/
@FunctionalInterface
public interface SingleReturnSingleParmeter{
    int test(int a);
}
--------------------------------------------------------------
//使用Lambda表达式实现接口:

SingleReturnSingleParmeter lambda3=(int a)->{
            return a*2;
        };
--------------------------------------------------------------
//精简Lambda表达式:
/**
* 参数小括号
* 如果参数列表中,参数的数量只有一个 此时小括号可以省略
*/
SingleReturnSingleParmeter lambda3=a->{
				return a*2;
			}
--------------------------------------------------------------

/**
* 大括号精简补充:
* 如果方法体中唯一的一条语句是一个返回语句
* 则省略大括号的同时 也必须省略return
*/
SingleReturnSingleParmeter lambda3 a->a*2;
  • 无返回值、多个参数的接口
/**
*函数式接口
*/
@FunctionalInterface
public interface NoneReturnMutipleParmeter {
    void test(int a,int b);
}
--------------------------------------------------------------
//使用Lambda表达式实现接口:

NoneReturnMutipleParmeter lambda2=(int a,int b)->{
            System.out.println("hello word");
        };
--------------------------------------------------------------
//精简Lambda表达式:
/**
* 参数类型
* 由于在接口的抽象方法中,已经定义了参数的数量类型
* 所以在Lambda表达式中参数的类型可以省略
* 备注:如果需要省略类型,则每一个参数的类型都要省略
* 千万不要一个省略一个不省略
*/
NoneReturnMutipleParmeter lambda2=(a,b)->
				System.out.println("hello word");

进阶(引用方法)

/**
*函数式接口
*/
@FunctionalInterface
public interface SingleReturnSingleParmeter{
    int test(int a);
}
/**
*方法引用:
* 注意:
*  1.引用的方法中,参数数量和类型一定要和接口中定义的方法一致
*  2.返回值的类型也一定要和接口中的方法一致
*/
public class Syntax {
 /**
 * 自定义的实现方法
 */
 private static int change(int a){
 	return a*2; 
  }
  /**
  *普通的引用
  */
 SingleReturnSingleParmeter lambda1=a->a*2;
 
//简化:可以快速的将一个Lambda表达式的实现指向一个已经实现的方法
SingleReturnSingleParmeter lambda4=a->change(a);

/**
* 方法的隶属者 如果是静态方法 隶属的就是一个类 其他的话就是隶属对象
* 语法:方法的隶属者::方法名
*/
SingleReturnSingleParmeter lambda5=Syntax3::change;
}