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

 更新时间:2017年08月02日 15:55:26   作者:我不是李大侠  
Lambda表达式理解为是 一段可以传递的代码。最直观的是使用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表达式和函数式接口,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • java String、Json对象与byte数组转换方式

    java String、Json对象与byte数组转换方式

    这篇文章主要介绍了java String、Json对象与byte数组转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 详解Java创建线程的五种常见方式

    详解Java创建线程的五种常见方式

    Java中如何进行多线程编程,如何使用多线程?不要担心,本文将为你详细介绍一下Java实现线程创建的五种常见方式,感兴趣的可以跟随小编学习一下
    2022-01-01
  • Spring中@Async用法详解及简单实例

    Spring中@Async用法详解及简单实例

    这篇文章主要介绍了Spring中@Async用法详解及简单实例的相关资料,需要的朋友可以参考下
    2017-02-02
  • Java 后端开发中Tomcat服务器运行不了的五种解决方案

    Java 后端开发中Tomcat服务器运行不了的五种解决方案

    tomcat是在使用Java编程语言开发服务端技术使用最广泛的服务器之一,但经常在开发项目的时候会出现运行不了的情况,这里总结出几种能解决的办法
    2021-10-10
  • 浅谈Spring中@Import注解的作用和使用

    浅谈Spring中@Import注解的作用和使用

    这篇文章主要介绍了浅谈Spring中@Import注解的作用和使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Java 数据结构与算法系列精讲之贪心算法

    Java 数据结构与算法系列精讲之贪心算法

    我们可能在好多地方都会听到贪心算法这一概念,并且它的算法思想也比较简单就是说算法只保证局部最优,进而达到全局最优。但我们实际编程的过程中用的并不是很多,究其原因可能是贪心算法使用的条件比较苛刻,所要解决的问题必须满足贪心选择性质
    2022-02-02
  • java中关于内部类的使用详解

    java中关于内部类的使用详解

    本篇文章介绍了,在java中关于内部类的使用详解。需要的朋友 参考下
    2013-04-04
  • Java实现按键精灵的示例代码

    Java实现按键精灵的示例代码

    这篇文章主要为大家详细介绍了如何利用Java语言实现按键精灵,文中的示例代码讲解详细,对我们学习或工作有一定的参考价值,感兴趣的可以学习一下
    2022-05-05
  • java中匿名内部类详解

    java中匿名内部类详解

    这篇文章主要对java中的匿名内部类的详细总结,需要的朋友可以参考下
    2017-04-04
  • 如何把idea中的项目导入github仓库中(图文详解)

    如何把idea中的项目导入github仓库中(图文详解)

    这篇文章主要介绍了如何把idea中的项目导入github仓库中,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07

最新评论