欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浅析Java8新特性Lambda表达式和函数式接口

程序员文章站 2023-12-20 16:28:46
什么是lambda表达式,java8为什么使用lambda表达式? “lambda 表达式”(lambda expression)是一个匿名函数,lambda表达式基于数...

什么是lambda表达式,java8为什么使用lambda表达式?

“lambda 表达式”(lambda expression)是一个匿名函数,lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。我们可以把 lambda表达式理解为是 一段可以传递的代码。最直观的是使用lambda表达式之后不用再写大量的匿名内部类,简化代码,提高了代码的可读性。

  // 启动一个线程,不使用lambda表达式
  new thread(new runnable() {
    @override
    public void run() {
      system.out.println("启动一个线程");
    }
  }).start();
  //使用lambda表达式,只需要一行代码
  new thread(() -> system.out.println("启动一个线程")).start();

lambda表达式的基本语法和格式

基本语法

  • java8中引入了新的操作符”->”,称为箭头操作符或者lambda操作符,箭头操作符将lambda拆分为两部分,左侧:lambda表达式的参数列表,右侧:lambda表达式中的所需要执行的的功能(接口实现的功能代码)。
  • lambda表达式需要“函数式接口”的支持,接口中只有一个抽象方法的接口称为函数式接口,可以使用注解@functionalinterface检查接口是否是函数式接口。
  • lambda表达式的参数列表的数据类型可以省略不写,因为jvm编辑器可以通过上下文判断。
  • 基本格式

① 无参数,无返回值。( ) -> system.out.println(“hello”)

  // 实现runnable接口(无参,无返回)
  runnable r = () -> system.out.println("hello lambda");

② 一个参数(小括号可以省略不写,习惯上加上小括号),无返回值。(x) -> system.out.println(x)

  //consumer接口(一个参数,无返回值),之后会提到
  //第一种,小括号不省略
  consumer<string> c = (x) -> system.out.print(x);
  c.accept("hello");
  //小括号省略
  consumer<string> c1 = x -> system.out.print(x);
  c1.accept("hello")

③ 有多个参数,并且lambda有多条语句,则lambda语句必须用大括号括起来并有return返回(若有一条语句则可以省略大括号和return),有返回值。(x,y) ->{system.out.println(“hello”);return integer.compare(x, y);};

//comparator接口
  //多条语句
  comparator<integer> comparator = (x,y) ->{
    system.out.println("hello");
    return integer.compare(x, y);
  };
  //一条语句
  comparator<integer> comparator2 = (x,y) -> integer.compare(x, y);
  system.out.println(comparator2.compare(23, 22));

还有其他的一些格式都是大同小异,这里就不再了解。

函数式接口是什么?

在前面也提到了函数接口,那么函数接口到底是什么呢?是个接口,只包含一个抽象方法,那么它就是函数式接口,我们可以在任意函数式接口上使用 @functionalinterface 检查它是否是一个函数式接口。
函数式接口里是可以包含默认方法、静态方法,他们不是抽象方法;也可以包含java.lang.object里的public方法,因为任何一个类都继承object类,包含了来自java.lang.object里对这些抽象方法的实现,也不属于抽象方法;函数式接口里允许子接口继承多个父接口,但每个父接口中都只能存在一个抽象方法,且必须的相同的抽象方法。

java8内置函数式接口

四大核心函数式接口

函数式接口 方法 参数类型 返回类型 作用
consumer<t> 消费型接口 void accept(t t) t void 对t类型的参数进行操作
supplier<t> 供给型接口 t get() t 操作数据,返回t类型的结果
function<t, r> 函数型接口 r apply(t t) t r 对t类型参数进行操作,并返回r类型的结果
predicate<t> 断定型接口 boolean test(t t) t boolean 确定t类型参数是否满足某约束,并返回boolean值
//consumer<t> 消费型接口
  @test
  public void test1(){
    consumer<string> c = (x) -> system.out.println("hello:"+x+"!");
    c.accept("java");
  }
  // supplier<t> 供给型接口
  @test
  public void test2(){
    supplier<string> s = () -> "hello,beautiful girl";
    string str = s.get();
    system.out.println(str);
  }
  //function<t,r> 函数性接口
  @test
  public void test3(){
    function<string, integer> f= (x) -> x.length();
    integer len = f.apply("hello");
    system.out.println(len);
  }
  //predicate<t> 断言型接口
  @test
  public void test4(){
    predicate<string> p = (x) -> x.length()>5;
    boolean b = p.test("hello java");
    system.out.println(b);
  }

其它函数式接口

函数式接口 方法 参数类型 返回类型 作用
bifunction<t , u, r > r apply(t t, u u) t, u r 对 t, u 类型的参数进行操作,并返回r类型的结果
unaryoperator<t> (function 子接口) t apply(t t) t t 对 t类型的参数进行一元运算,并返回r对象的结果
binaryoperato<t,r> (bifunction 子接口) ) t apply(t t1, t t2 t, t t 对t类型的参数进行二元运算,并返回t类型的结果
biconsumer<t, u> void accept(t t, u u) t, u void 对t,作
tointtointfunction<t> tolongfunction<t> todoublefunction<t&gt int(long,double) applyasint(t value) t int, long, double 计 算 int 、 long 、double值的函数
intfunction<r> longfunction<r> doublefunction<r> r apply(int(long,double) value) int, long, double r 参数分别为int、long、double 类型的函数

总结

以上所述是小编给大家介绍的java8新特性lambda表达式和函数式接口,希望对大家有所帮助

上一篇:

下一篇: