Lambda表达式学习(1)

Lambda表达式

一、Lambda表达式简介

什么是Lambda表达式?

Lambda是Java 8添加的一个新的特性。其实就是一个匿名函数。

为什么要使用Lambda表达式?

使用Lambda表达式可以对一个接口进行非常简洁的实现。

Lambda对接口的要求是什么?

虽然可以使用lambda表达式对某些接口进行简单的实现,但是并不是所有的接口都可以用lambda表达式实现。
要求接口中定义的必须要实现的抽象方法只能是一个。

在Java 8中对接口加了一个新的特性:default。

对于只有一个抽象方法的接口,称为函数式接口

@FunctionalInterface
修饰函数式接口的。接口中的抽象方法只有一个否则报错。

下面的代码段展示了一个函数式接口分别用实现类、匿名函数、lambda表达式实现:

package lambda;
public class Program {
 public static void main(String[] args) { 
  //1.使用接口实现类
  Comparator comparator=new MyComparator();
  
  //2.使用匿名内部类
  Comparator comparator1=new Comparator() {
   public int compare(int a,int b) {
   return a-b;
   }
  };
  
  //3.使用Lambda表达式来实现接口
  Comparator comparator2= (a,b)->a-b ;
 }
}

class MyComparator implements Comparator{
 public int compare(int a,int b) {
  return a-b;
 }
}

定义接口:

package lambda;
interface Comparator {
 int compare(int a,int b);
}

Lambda表达式语法

基本语法:
( ):表示参数列表,不需要指定参数的类型,会自动推断
->:连接符
{ }: 表示方法体

具体语法看代码:

package lambda;

public class TestLambda {
 public static void main(String[] args) { 
 
  //匿名内部类的方式实现,在Java8之前,没有Lambda表达式
  UserTest ut=new UserTest() {
   public void test() {
    System.out.println("使用匿名内部类实现");
   }
  };
  ut.test();
  
  //():表示参数列表,不需要指定参数的类型,会自动推断
  //->:连接符
  //{}: 表示方法体
  UserTest ut1=()->{
   System.out.println("使用lambda表达式实现");
   };
  ut1.test();
  
  //如果方法体只有一句话,可以省略大括号以及省略一个分号。
  UserTest ut2=()->System.out.println("最简化的lambda表达式实现");
  ut2.test();

  int i=100;
  //圆括号里面只需要知道参数的名称,不需要参数的类型
  //数据类型自动根据函数式接口的定义推断。
  UserTest1 ut3=(x)->{
   System.out.println("一个参数,一行代码输出参数的值:"+x);
  };
  ut3.test(i);
  //如果参数列表里面只有一个参数可以省略圆括号。
  UserTest1 ut4=x->{
   System.out.println("一个参数,省略圆括号,一行代码输出参数的值:"+x);
  };
  ut4.test(i);
  
  //
  UserTest2 ut5=(x,y)->{
   System.out.println("两个参数:"+x);
   System.out.println("两个参数:"+y);
  };
  ut5.test(2,19);
  
  UserTest3 ut6=x->{
   x=x+10;
   return x;
  };
  int io=ut6.test(15);
  System.out.println(io);//25
  
  //如果省略了大括号,return一定也要省略掉。
  //代码里面的表达式返回值会自动作为方法的返回值
  UserTest3 ut7=x->x+10;
  int o=ut7.test(15);
  System.out.println(o);//25
 }
}

//没有参数,没有返回值
@FunctionalInterface
interface UserTest{
 void test();
 //void test2();   //因为前面有@FunctionalInterface,所以报错
 //default关键字表示默认实现,所以可以有下面方法而不报错
 default void test3() {}
}
//接口方法有一个参数,无返回值
@FunctionalInterface
interface UserTest1{
 void test(int i);
}
//接口方法有两个参数,无返回值
@FunctionalInterface
interface UserTest2{
 void test(int i ,int j);
}
//接口方法有一个参数,有返回值
@FunctionalInterface
interface UserTest3{
 int test(int i);
}

运行结果:
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值