zoukankan      html  css  js  c++  java
  • Java中的lambda匿名函数使用

    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的一部分。

  • 相关阅读:
    Gym
    Gym
    Gym
    LA 3713 宇航员分组
    LA 3211 飞机调度(2—SAT)
    POJ 1050 To The Max
    51nod 1050 循环数组最大子段和
    UVa 11149 矩阵的幂(矩阵倍增法模板题)
    POJ 1236 Network of School
    UVa 11324 最大团(强连通分量缩点)
  • 原文地址:https://www.cnblogs.com/JonnyJiang-zh/p/13702842.html
Copyright © 2011-2022 走看看