java8 Lambda表达式的使用总结

简介:
 Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁,更灵活的代码。
案例:
 话不多说,直接先看例子:
语法格式一:无参,无返回值
首先我们先在单元测试内写出我们的原始代码:
 
定义一个Run接口,里面只有一running(无参)方法
interface Run{
  void running();
}给出初始单元测试,实现Run接口的匿名实现类
@Test
  public void test01() {
    Run runner=new Run() {
      @Override
      public void running() {
        System.out.println("人类会跑步");
      }
    };
    runner.running();
  }下面便是lambda表达式的使用(打印结果皆是一致):
 使用lambda表达式时可写成:
@Test
  public void test02() {
    Run runner=()->System.out.println("人类会跑步");
    runner.running();
  }语法格式二:有一参,无返回值
首先是接口:
interface Run{
  void running(String name);
}匿名实现类:
@Test
  public void test07() {
    Run runner=new Run() {
      @Override
      public void running(String name) {
        System.out.println(name+"能跑步");
      }
    };
    runner.running("小邱");
  }lambda表达式:
@Test
  public void test08() {
    Run runner=(String name)->System.out.println(name+"能跑步");
    runner.running("小邱");
  }还可直接将数据类型省略,因为可以由编译器推断得出,称为“类型推断”
@Test
  public void test08() {
    Run runner=(name)->System.out.println(name+"能跑步");
    runner.running("小邱");
  }只有一个参数时,可省略小括号:
@Test
  public void test09() {
    Run runner=name->System.out.println(name+"能跑步");
    runner.running("小邱");
  }语法格式三:有两参,无返回值
还是那个接口,在其方法中加入两个参数
interface Run{
  void running(String name,int distance);
}其原匿名实现类:
@Test
  public void test01() {
    Run runner=new Run() {
      @Override
      public void running(String name,int distance) {
        System.out.println(name+"能跑"+distance+"公里");
      }
    };
    runner.running("小邱",100);
  }使用lambda表达式:
@Test
  public void test06() {
    Run runner=(String name,int distance)->System.out.println(name+"能跑"+distance+"公里");
    runner.running("小邱",100);
  }还可直接将数据类型省略,因为可以由编译器推断得出,称为“类型推断”
@Test
  public void test02() {
    Run runner=(name,distance)->System.out.println(name+"能跑"+distance+"公里");
    runner.running("小邱",100);
  }格式四:有两参,有返回值
这里我们使用java中的Comparator接口来作为例子:
 
比较传入的两个数的大小
@Test
  public void test03() {
    Comparator com1=new Comparator() {
      @Override
      public int compare(Integer o1, Integer o2) {
        return Integer.compare(o1, o2);
      }
    };
    int compare1=com1.compare(10, 20);
    System.out.println(compare1);
  }  按照格式二中的写法便可以写成:
@Test
  public void test04() {
    Comparator com1=(o1,o2)->Integer.compare(o1, o2);
    int compare1=com1.compare(10, 20);
    System.out.println(compare1);
  } 如果用方法引用(调用类中静态方法)的话就可以写成:
@Test
  public void test05() {
    Comparator com1=Integer::compare;
    int compare1=com1.compare(10, 20);
    System.out.println(compare1);
  } 格式五:多参,多条语句
匿名实现类:
@Test
  public void test07() {
    Comparator com1=new Comparator() {
      @Override
      public int compare(Integer o1, Integer o2) {
        System.out.println(o1);
        System.out.println(o2);
        return o1.compareTo(o2);
      }
    };
  }  lambda表达式:
@Test
  public void test08() {
    Comparator com1=(o1,o2)->{
      System.out.println(o1);
      System.out.println(o2);
      return o1.compareTo(o2);
    };
  } 总结:
1)举例:(o1,o2)->Integer.compare(o1,o2);
 
2)格式:
“->”:lambda操作符 或 箭头操作符
"->"左边:lambda形参列表(就是接口中的抽象方法的形参列表)
"->"右边:lambda体(就是重写的抽象方法的方法体)3)
->左边:lambda形参列表的参数类型可以省略(类型推断):如果lambda形参列表只有一个参数,其小括号也可以省略。
->右边:lambda体应该由一对{}包裹,如果lambda题只有一条执行语句,那么可以省略{}4)lambda的本质:作为接口的实例。
原文链接:csdn.net/qq_45273552/article/details/109296786
评论
