lambda函数式编程总结

it2022-05-05  215

lambda函数式编程总结

lambda是java8版本的新特性,其主要针对于函数式接口(就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口)

函数式语言提供了一种强大的功能——闭包(函数中,能访问函数外的变量,并且函数外的变量值改变后,会影响函数内的计算)

相比于传统的编程方法有很多优势,闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。Java 现在提供的最接近闭包的概念便是 Lambda 表达式,虽然闭包与 Lambda 表达式之间存在显著差别,但至少 Lambda 表达式是闭包很好的替代者。

Lambda语法:

()->{} ()里面存放的是参数 {}重写抽象方法具体逻辑 ->执行方法体

1.无参无返回值

public class FLambda { public static void main(String[] args) { functionlambda n1 = ()->{ System.out.println("无参无返回值"); }; n1.show(); } } interface functionlambda { void show(); }

2.无参有返回值

public class FLambda { public static void main(String[] args) { functionlambda n1 = () -> { return 5; }; System.out.println(n1.show()); } } interface functionlambda { int show(); }

3.有一个参数有返回值

public class FLambda { public static void main(String[] args) { functionlambda n1 = (a) -> { return 5+a; }; System.out.println(n1.show(5)); } } interface functionlambda { int show(int a ); }

4.多个参数有返回值

public class FLambda { public static void main(String[] args) { functionlambda n1 = (a,b) -> { return b+a; }; System.out.println(n1.show(5,6)); } } interface functionlambda { int show(int a,int b ); }

5.有一个参数无返回值

public class FLambda { public static void main(String[] args) { functionlambda n1 = (a) -> { System.out.println(a); }; n1.show(10); } } interface functionlambda { void show(int a); }

6.有多个参数无返回值

public class FLambda { public static void main(String[] args) { functionlambda n1 = (a,b) -> { System.out.println(a+b); }; n1.show(7, 3); } } interface functionlambda { void show(int a,int b ); }

如果对自己编写的函数式接口判断不出错误,可以添加**@FunctionalInterface 注解**,帮助判断是否是函数式接口.

lambda省略原则:

1.参数类型可以省略,当出现多个参数时,如果省略必须全部省略

2.若只有一个参数,可以省略()

3.方法体中只有一条语句,可以省略{}

4.如果方法体中,唯一一条语句是return 可以省略return关键字

lambda方法引用:

它的作用是将一个lambda表达式指向一个已经实现的方法,下面我们举例说明一下

public class FLambda { public static void main(String[] args) { functionlambda n1 = a -> change(a); System.out.println(change(7)); } public static int change(int a ) { return a*2; } } interface functionlambda { void show(int a); }

上面的lambda方法体中引用了change方法.

1.静态方法引用

语法: 类名**:?*静态方法

与静态方法调用.作用相同,但是要注意一点 change(),show()两者之间的参数类型,参数数量,返回值类型必须保持一致

public class FLambda { public static void main(String[] args) { functionlambda n1 = FLambda::change; System.out.println(n1.show()); } public static int change() { return 5; } } interface functionlambda { int show(); }

2.非静态方法

语法: 对象名::非静态方法

public class FLambda { public static void main(String[] args) { functionlambda n1 =fflambda::doshow; System.out.println(n1.show(1));//这个传任意参数,都是打印777 因为方法引用 返回777 } } interface functionlambda { int show(int a); } class fflambda{ public static int doshow(int a ) { return 777; } }

3.构造方法

语法: 对象名::new

用法与上面的都是相同的,只是关键字需要用new,在此不进行举例说明了.

lambda实用案例

1.用于集合排序,将persion对象按着年龄升序

public class text { public static void main(String[] args) { ArrayList<persion> a = new ArrayList<>(); Collections.addAll(a, new persion("小明", 17), new persion("小王", 11), new persion("小李", 19), new persion("小刘", 10)); a.sort((o1, o2) -> o1.age - o2.age); System.out.println(a); } }

2.用于TreeSet自定义排序(1.在persion中实现Comparable接口, 2.通过外部比较器Compator来进行自定义),在没有指定规则对set对象进行排序,程序运行会出现异常

public class text01 { public static void main(String[] args) { TreeSet<persion> a = new TreeSet<>((o1, o2) -> o1.age - o2.age); Collections.addAll(a, new persion("小明", 17), new persion("小王", 11), new persion("小李", 19), new persion("小刘", 10)); System.out.println(a); } }

最新回复(0)