一文搞定Java的Lambda表达式

素颜马尾好姑娘i 2022-12-15 06:14 276阅读 0赞

写在前面的话:“在成功的道路上,活力是需要的,志向是可贵的,但更重要的是那毫无情趣的近乎平常的坚守的毅力和勇气。”你好,我是梦阳辰,未来我和你一起成长。

什么是Lambda表达式?
Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。

Lambda允许把函数作为一个方法的参数(函数作为参数传递到方法中)。
为什么要使用Lambda表达式?
可以写出更简洁的,更灵活的代码。作为一种更紧凑的代码风格,是java的语言表达能力得到了提升。

对比:

  1. import java.util.Comparator;
  2. import java.util.TreeSet;
  3. public class LambdaTest {
  4. //原来的匿名内部类
  5. public void test1(){
  6. Comparator<Integer> com = new Comparator<Integer>() {
  7. @Override
  8. public int compare(Integer o1, Integer o2) {
  9. return Integer.compare(o1,o2);
  10. }
  11. };
  12. TreeSet<Integer> ts = new TreeSet<>(com);
  13. }
  14. //Lambda表达式
  15. public void test2(){
  16. Comparator<Integer> com = (x,y) ->Integer.compare(x,y);
  17. TreeSet<Integer> ts = new TreeSet<>(com);
  18. }
  19. }

在这里插入图片描述

3.Lambda表达式的基础语法
Java8中引入了一个新的操作符“->”该操作符称为箭头操作符或Lambda操作符。
箭头操作符将Lambda表达式拆分为两个部分。

左侧:Lambda 表达式列表(接口中方法中的参数列表)。

右侧:表达式中所需执行的功能(接口中实现的代码)。

语法格式:

1.抽象方法,无参,无返回值
() -> System.out.println(“Hello Lambda”);

2.有一个参数,无返回值
(x) ->System.out.println(x);

  1. public void test1(){
  2. Consumer<String> con = (x) -> System.out.println(x);
  3. con.accept("fda");
  4. }

3.有一个参数,小括号可以省略不写。

4.有两个以上的参数,并且Lambda体中,有多条语句,有返回值。
Compatator com = (x,y) ->{
System.out.println(“函数式接口”);
return Integer.compare(x,y);
};

  1. public void test2(){
  2. Compatator<Integer> com = (x,y) ->{
  3. System.out.println("函数式接口");
  4. return Integer.compare(x,y);
  5. };
  6. }

5.有两个以上的参数,并且Lambda体中,只有一条语句,return和大括号都可以省略不写。

  1. com = (x,y) -> Integer.compare(x,y);

6.Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器可以通过上下文推断。

lambda 表达式只能引用标记了 final 的外层局部变量(final可以省略),这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。

Lambda表达式需要函数式接口的支持

函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。

使用注解@FunctionalInterface修饰,可以检查接口是否是函数式接口。

案例1:实现数据运算

  1. @FunctionalInterface
  2. public interface Myfun {
  3. public Integer getValue(Integer num);//抽象方法
  4. }
  5. public class Test {
  6. public static void main(String[] args) {
  7. Integer num= operation(100,x->x*x);//乘
  8. Integer num2= operation(100,x->{
  9. int result = x+900;return result;});//乘
  10. System.out.println(num2);
  11. }
  12. /** * 对数据进行操作 * @param num * @param mf * @return */
  13. public static Integer operation(Integer num,Myfun mf){
  14. return mf.getValue(num);
  15. }
  16. }

进阶练习:
1.调用Collections.sort()方法,通过定制排序比较两个Employee(先按年龄比,年龄相同
按姓名比),使用Lambda作为参数传递。

  1. import java.util.*;
  2. public class Test {
  3. public static void main(String[] args) {
  4. List<Employee> list = Arrays.asList(
  5. new Employee("MengYangChen",18,2000),
  6. new Employee("Meng",21,1000),
  7. new Employee("MenaYang",21,20000)
  8. );
  9. /* Comparator<Employee> a = new Comparator() { @Override public int compare(Object o1, Object o2) { return ; } }*/
  10. /* Comparator<Employee> e = (x,y)->{ if(x.getAge()==y.getAge()){ return x.getName().compareTo(y.getName()); } return Integer.compare(x.getAge(),y.getAge());};*/
  11. Collections.sort(list,(x,y)->{
  12. if(x.getAge()==y.getAge()){
  13. return x.getName().compareTo(y.getName());
  14. }
  15. return Integer.compare(x.getAge(),y.getAge());});
  16. Iterator<Employee> it = list.iterator();
  17. while (it.hasNext()){
  18. System.out.println(it.next().getName());
  19. }
  20. }
  21. }
  22. public class Employee {
  23. private String name;
  24. private int age;
  25. private double salary;
  26. public Employee(String name, int age, double salary) {
  27. this.name = name;
  28. this.age = age;
  29. this.salary = salary;
  30. }
  31. public String getName() {
  32. return name;
  33. }
  34. public void setName(String name) {
  35. this.name = name;
  36. }
  37. public int getAge() {
  38. return age;
  39. }
  40. public void setAge(int age) {
  41. this.age = age;
  42. }
  43. public double getSalary() {
  44. return salary;
  45. }
  46. public void setSalary(double salary) {
  47. this.salary = salary;
  48. }
  49. }

在这里插入图片描述

2.①声明函数式接口,接口中声明抽象方法,public String getValue(String str);
②声明类TestLambda ,类中编写方法使用接口作为参数,将一个字符串转换成大写,
并作为方法的返回值。
③再将一个字符串的第2个和第4个索引位置进行截取子串。

  1. @FunctionalInterface
  2. public interface Myfunction {
  3. public String getValue(String str);
  4. }
  5. public class Test {
  6. public static void main(String[] args) {
  7. String upper = operate("abc",str->str.toUpperCase());
  8. }
  9. //对两个double类型数据进行操作
  10. public static String operate (String str,Myfunction Myfun){
  11. return Myfun.getValue(str);
  12. }
  13. }

3.①声明一个带两个泛型的函数式接口,泛型类型为T为参数,R为返回值。
②接口中声明对应抽象方法
③在TestLambda类中声明方法,使用接口作为参数,计算两个long型参数的和。-
④再计算两个long型参数的乘积。-

  1. package Chapters6.Lambda3;
  2. public class Test {
  3. public static void main(String[] args) {
  4. operate(100,200,(x,y)->x+y);//加
  5. operate(100,200,(x,y)->x*y);//乘
  6. }
  7. //对两个double类型数据进行操作
  8. public static void operate (double a,double b,Myfunction<Double,Double> myfun){
  9. System.out.println(myfun.getValue(a,b));
  10. }
  11. }
  12. package Chapters6.Lambda3;
  13. @FunctionalInterface
  14. public interface Myfunction <T,R>{
  15. public R getValue(T t1,T t2);
  16. }

无论你正遭遇着什么,你都要从落魄中站起来重振旗鼓,要继续保持热忱,要继续保持微笑,就像从未受伤过一样。

在这里插入图片描述
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,276人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Scala

    第一节:概述 为什么学习Scala ? Apache Spark 是专为大规模数据快速实时处理的计算引擎/内存级大数据计算框架。Apache Spark 是由Sca