相关文章推荐
玩手机的硬盘  ·  html 虚线-掘金·  1 年前    · 

Java中的lambda匿名函数使用

lambda匿名函数的使用是为了满足某些情况下需要临时定义函数,或者事先定义,需要时才使用。在python里面,lambda表达式的表达方式为: lambda 参数: 表达式 ,例如,需要对一个列表的每项元素进行加1操作,我们就可以这样: list(map(lambda x: x+1, range(10)) ,上述表达式中: list(iterables) 是将括号里的参数转换成列表样式,参数要求是可迭代对象; map(func, iterables) 则是将 iterables 可迭代对象中的每个元素都调用函数func; lambda x: x+1 则是一个匿名函数,参数为x,对x进行加1操作; range(10) 则是生成一个[0,1,2,3,4,5,6,7,8,9]的列表,也就是Java中的数组。

一下是python中的map函数的源码解释

回到我们的Java,Java中的lambda表达式则有一点不一样,语法为 (参数1,参数2) -> statements/block ,当不需要参数时,就可以直接写为 () -> statement/block ,比如说 () -> System.out.println("I use lambda") 。其实现当时需要一个函数接口,函数接口形如 public static void func(Interface action) { statements;} ,关于函数接口,就是定义一个函数,参数为一个接口类型,里面的语句就是调用接口中定义的方法。因为接口只是定义了,并没有实现方法,所以说当我们将一个形如lambda函数的 函数引用 传入时,该函数就会直接实现传入的函数。比如说:

public interface interfaceTest { //定义一个函数接口
    void test();
public class test {
    public static void main(String[] args) {
          tt(()-> System.out.println("调用lambda"));
    public static void tt(interfaceTest action){ 
        action.test(); //调用函数接口中未实现的方法

另外一个带参数的例子:

public interface interfaceTest { //定义一个函数接口
    void test(int value); //
public class test {
    public static void main(String[] args) {
          tt(10;(i)-> System.out.println(i+1)); // lambda语句的意思为给参数实行+1操作
    public static void tt(int n,interfaceTest action){ 
        for (int i=0;i<n;i++) {
            action.test(i);

函数引用。lambda表达式实则上一个函数引用,除此之外还有另一个例子:

public interface interfaceTest { //定义一个函数接口
    void test();
public class test {
    public static void main(String[] args) {
        repeat(10, test::test));
      public static void test() {
        System.out.println("hello");
    public static void repeat(int n, interfaceTest action)
        for (int i = 0; i < n; i++) action.test();

这里函数引用主要有三种情况:

  • object::instanceMethod
  • Class::staticMethod
  • Class::instanceMethod
  • 就拿第一种来说,就描述的是object中的instanceMethod方法,其中instanceMethod的参数类型需要与定义的函数接口一致,若函数引用中的函数有参数,则函数接口也应该有相应的参数。比如说:

    public interface interfaceTest { //定义一个函数接口
        void test(int value); 
    public class test {
        public static void main(String[] args) {
            repeat(10,test::testTwo);
        public static void repeat(int n, interfaceTest action)
            for (int i = 0; i < n; i++) action.testTwo(i);
        public static void testTwo(int n) {
            System.out.println("test:"+n);
    

    可能有人会说lambda函数跟这个有什么关系,我们看看下面这个:

    就可以知道,其实函数引用也是属于lambda的一部分。

    最后,读者整理一些关于Java高并发的资料,欢迎大家阅览:
    关于Java高并发你需要知道的“升段位攻略”