Java中的lambda匿名函数使用

时间:2023-03-09 00:21:36
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中的lambda匿名函数使用

回到我们的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函数跟这个有什么关系,我们看看下面这个:

Java中的lambda匿名函数使用

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