加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java8 Lambda表达式

发布时间:2020-12-14 06:40:49 所属栏目:Java 来源:网络整理
导读:概述 lambda表达式, 是Java8中的一个新特性。可以理解为一个匿名函数。 lambda表达式可以理解为将一个函数浓缩为一行代码,使代码更加简洁紧凑。 lambda表达式语法: (parameters) -> statement; 或 (parameters) -> {statements;} 参数如下: parameters:

概述

lambda表达式, 是Java8中的一个新特性。可以理解为一个匿名函数。

lambda表达式可以理解为将一个函数浓缩为一行代码,使代码更加简洁紧凑。

lambda表达式语法:

(parameters) -> statement;

(parameters) -> {statements;}

参数如下:

  • parameters:参数, 可以指定或不指定参数类型, 当只有一个参数时可以不要圆括号
  • statement:函数返回值,直接返回该值,无需大括号
  • statements:函数体,当使用大括号时需要指明表达式返回的值

lambda表达式实例:

// 无参,返回5() -> 5;// 接收参数x,返回2*xx -> 2 * x;// 接收参数x y,返回x+y(x,y) -> x + y;// 指明接收参数类型(int x,int y) -> x + y;// 接收字符串并打印,无返回值(String s) -> System.out.print(s);// 包括函数体(String s) -> { System.out.print(s); return s;  };

Java中使用lambda表达式

在Python中是有的。但是Python中万物皆对象,直接将函数赋值给一个变量即可,那么在Java中该如何使用lambda表达式呢?

Java8 Lambda表达式

Java8 Lambda表达式

可以看出lambda表达式实质是实现了接口中的方法,怎么感觉向匿名内部类呢?

lambda表达式与匿名内部类的区别:

  1. this关键字。匿名内部类中的this指当前匿名类,lambda表达式中的this指lambda的外部类。

FunctionInterface注解:

@ FunctionInterface 是Java8中新加入的接口, 用于指明该接口是根据Java语言规范定义的函数式接口。例如如下代码:

@FunctionInterfacepublic interface MathOperation{ public int operation(int a,int b);}

若在接口中加入更多的抽象方法, 将抛出编译错误。

lambda表达式中的变量

Java8 Lambda表达式

这样看没什么毛病,但是要想在后面修改该字符串,问题就来了

Java8 Lambda表达式

可以看到,lambda表达式使用的外部的局部变量必须是final的,那么成员变量呢?

Java8 Lambda表达式

成员变量以及静态变量可以使用,并在之后进行修改,至于原因可以看我的这篇文章

Java中lambda表达式举例

那么Java中引入lambda表达式可以带来怎样的便利呢?通过下面几个例子可以看一看:

1.创建线程

Java8 Lambda表达式

2.遍历list

Java8 Lambda表达式

当然还有很多,可以自己尝试

Java8 函数式接口

函数式接口就是一个有且仅有一个抽象方法,但可以有多个非抽象方法的接口.

函数式接口很好的支持了lambda表达式。

JDK1.8之前以有的函数式接口:

  • java.lang.Runable
  • java.util.concurrent.Callable
  • java.security.PrivilegedAction
  • java.util.Comparator
  • java.io.FileFilter
  • java.nio.file.PathMatcher
  • java.lang.reflect.InvocationHandler
  • java.beans.PropertyChangeListener
  • java.awt.event.ActionListener
  • javax.swing.event.ChangeListener

JDK1.8新增的函数式接口:

java.util.function 包下包含了很多类,用来支持Java的函数式编程,该包下的函数式接口有:

  1. BiConsumer:代表了一个接受两个输入参数的操作,并且不返回任何结果
  2. BiFunction:代表了一个接受两个输入参数的方法,并且返回一个结果
  3. BinaryOperator:代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果
  4. BiPredicate:代表了一个两个参数的boolean值方法
  5. BooleanSupplier:代表了boolean值结果的提供方
  6. Consumer:代表了接受一个输入参数并且无返回的操作
  7. DoubleBinaryOperator:代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。
  8. DoubleConsumer:代表一个接受double值参数的操作,并且不返回结果。
  9. DoubleFunction:代表接受一个double值参数的方法,并且返回结果
  10. DoublePredicate:代表一个拥有double值参数的boolean值方法
  11. DoubleSupplier:代表一个double值结构的提供方
  12. DoubleToIntFunction:接受一个double类型输入,返回一个int类型结果。
  13. DoubleToLongFunction:接受一个double类型输入,返回一个long类型结果
  14. DoubleUnaryOperator:接受一个参数同为类型double,返回值类型也为double 。
  15. Function:接受一个输入参数,返回一个结果。
  16. IntBinaryOperator:接受两个参数同为类型int,返回值类型也为int 。
  17. IntConsumer:接受一个int类型的输入参数,无返回值 。
  18. IntFunction:接受一个int类型输入参数,返回一个结果 。
  19. IntPredicate:接受一个int输入参数,返回一个布尔值的结果。
  20. IntSupplier:无参数,返回一个int类型结果。
  21. IntToDoubleFunction:接受一个int类型输入,返回一个double类型结果 。
  22. IntToLongFunction:接受一个int类型输入,返回一个long类型结果。
  23. IntUnaryOperator:接受一个参数同为类型int,返回值类型也为int 。
  24. LongBinaryOperator:接受两个参数同为类型long,返回值类型也为long。
  25. LongConsumer:接受一个long类型的输入参数,无返回值。
  26. LongFunction:接受一个long类型输入参数,返回一个结果。
  27. LongPredicate:R接受一个long输入参数,返回一个布尔值类型结果。
  28. LongSupplier:无参数,返回一个结果long类型的值。
  29. LongToDoubleFunction:接受一个long类型输入,返回一个double类型结果。
  30. LongToIntFunction:接受一个long类型输入,返回一个int类型结果。
  31. LongUnaryOperator:接受一个参数同为类型long,返回值类型也为long。
  32. ObjDoubleConsumer:接受一个object类型和一个double类型的输入参数,无返回值。
  33. ObjIntConsumer:接受一个object类型和一个int类型的输入参数,无返回值。
  34. ObjLongConsumer:接受一个object类型和一个long类型的输入参数,无返回值。
  35. Predicate:接受一个输入参数,返回一个布尔值结果。
  36. Supplier:无参数,返回一个结果。
  37. ToDoubleBiFunction:接受两个输入参数,返回一个double类型结果
  38. ToDoubleFunction:接受一个输入参数,返回一个double类型结果
  39. ToIntBiFunction:接受两个输入参数,返回一个int类型结果。
  40. ToIntFunction:接受一个输入参数,返回一个int类型结果。
  41. ToLongBiFunction:接受两个输入参数,返回一个long类型结果。
  42. ToLongFunction:接受一个输入参数,返回一个long类型结果。
  43. UnaryOperator:接受一个参数为类型T,返回值类型也为T。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读