Java 8的新特性-Lambda

java 8的新特性-Lambda

Lambda表达式:

一、Lambda初识
Lambda是一个匿名函数,我们可以吧Lambda表达式理解为一段可以传递的代码(将代码向数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,是Java语言表达能力提升。
二、Lambda基础
1)、Lambda基本语法

  • Java8中引入一个新的操作符"->"该操作符称为箭头操作符,箭头操作符将Lambda查分成了两个部分:左侧(Language表达式的参数列表)右侧(Language表达式的代码体)
  • 语法一:无参,无返回值
 -   @Test
  void testLambda() {
  	int num= 0;// 在jdk1.7一前,必须是final,在jdk1.8之后默认加上了final
  	
    Runnable runnable =new Runnable() {
      @Override
      public void run() {
        System.out.println("Hello Word!!" + num);
      }
    };
    runnable.run();
    System.out.println("---------------");
      Runnable runnable1=() -> System.out.println("Hello Lambda" + num);
      runnable1.run();
  }

执行结果

Hello Lambda!!
---------------
Hello Lambda

进程已结束,退出代码为 0
  • 语法二:有一个参数无返回值
  @Test
  void testLambda() {
  Consumer<String> consumer =(x) -> System.out.println(x);
       consumer.accept("我今天学习了Lambda!!");
  }

执行结果

我今天学习了Lambda!!
  • 语法三:只有一个参数,小括号可以不写
  @Test
  void testLambda() {
  Consumer<String> consumer = x -> System.out.println(x);
       consumer.accept("我今天学习了Lambda!!");
  }

执行结果

我今天学习了Lambda!!
  • 语法四:有多个参数,多个返回值,并且Lambda体中有多条语句
 -   @Test
  void testLambda() {
    Comparator<Integer>  comparator = (o1,o2)  -> {
      System.out.println("注意多天语句用{}"+o1+o2);
      return Integer.compare(o1,o2);
    }; //此测试方法没有结果
  • 语法五:有多个参数且一条语句,大括号和return都可以省略不写
  @Test
  void testLambda() {
    Comparator<Integer>  comparator = (o1,o2) -> Integer.compare(o1,o2);
  }
  • 语法六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文可以推断出数据类型,即"类型"推断"。
    三、Lambda 表达式需要”函数式接口“的支持
    1)、函数式接口:接口中只有一个抽象方法的接口,可以使用注解@FunctionInterface 修饰(可以检查是否是函数是接口)
 //测试方法
  @Test
  void testLambda() {
    Integer num = SumAndAvg(100, x -> x * x);
    System.out.println(num);
  }
  //实现接口
  public Integer SumAndAvg(Integer num, MyFun mf) {
    return mf.getnum(num);
  }
  //接口
  @FunctionalInterface
  public interface MyFun {
  Integer getnum(Integer x);
  }
  • Lambda练习
//练习一:调用Collections.sort()方法,通过定制排序比较两个Employee(先按年龄,年龄相同按姓名比)
 List<Student> students = Arrays.asList(
      new Student("陈凯", 100),
      new Student("夏洛", 90),
      new Student("马冬梅", 10)
  );

  @Test
  void exercise1() {
    Collections.sort(students, (e1, e2) -> {
      if (e1.getAge().equals(e2.getAge())) {
        return e1.getName().compareTo(e2.getName());
      } else {
        return Integer.compare(e1.getAge(), e2.getAge());
      }
    });
    for (Student student : students) {
      System.out.println(student);
    }
  }
//声明函数式接口,接口中编写方法使用接口作为参数,将一个字符串转换成大写,并作为方法的返回值。
  @Test
  void exercise2() {
    String str = transform("xxxx", (x) -> x.toUpperCase());
    System.out.println(str);
  }

  public String transform(String num, Myfun1 mf1) {
    return mf1.getValue(num);
  }
//声明一个带两个泛型的函数式的接口,泛型类型<T,R>T为参数,R为返回值
//接口中声明对应的抽象类
//在TestLambda类中声明方法,使用接口作为参数,计算两个Long类型的和,在计算两个Long的乘积。
  @Test
  void exercise3() {
    Long aLong = transform01(23L, 44L, (i, j) -> i + j + i * j);
    System.out.println(aLong);
  }

  public Long transform01(Long i, Long j, Myfun2<Long, Long> mf) {
    return mf.grtvalue(i, j);
  }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值