Java8 Lambda表达式

概述

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

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

lambda表达式语法:

(parameters) -> statement;

(parameters) -> {statements;}

参数如下:

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

lambda表达式实例:

// 无参,返回5
() -> 5;
// 接收参数x,返回2*x
x -> 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语言规范定义的函数式接口。例如如下代码:

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

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

lambda表达式中的变量

Java8 Lambda表达式

 

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

Java8 Lambda表达式

 

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

Java8 Lambda表达式

 

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

Java 内部类

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508588.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java8 方法引用

概述 方法引用是用来直接访问类或实例阴茎存在的方法或者构造方法.它需要由兼容的函数式接口(lambda表达式中用到的接口)构成的目标类型上下文. 有时候, 当我们想要实现一个函数式接口的方法, 但是已经由类实现了我们想要的功能, 这时可以使用方法引用来直接使用现有的功能实现…

配置过程中的一些问题

一、 Tomcat相关问题 1、百度经验有设置用户名密码&#xff0c;但是按照步骤进行&#xff0c;到测试的时候发现还是错误的。 解决&#xff1a;在设置的时候应该stop Tomcat&#xff0c;在设置好之后再重新开启Tomcat&#xff0c;发现可以。 2、把web项目加入Tomcat&#xff0…

流媒体通信协议HLS与DASH的对比

简单了解 HLS(HTTP Live Streaming)协议 是由苹果公司实现的基于HTTP的流媒体通信协议&#xff0c;并成为Quick TIme X和IPhone软件系统的一部分。苹果的IPad也有支持HLS的能力。 HLS传出的视频文件为基于MPEG2文件的切片&#xff0c;每个媒体切片在服务器上单独存放。在一个流…

Activity的四种启动模式和onNewIntent()

Android中Activity启动模式详解 在Android中每个界面都是一个Activity&#xff0c;切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。 Android总Activity的启动模式分为四种&#xff1a; Activity启动模式设置…

Java8 默认方法

概述 Java8新增了接口的默认方法。使用default关键字。 默认方法就是接口可以有实现方法&#xff0c;而且不需要实现类来实现其方法。相对于JDK1.8之前的接口来说&#xff0c;新增了可以接口中实现方法。 可以说在接口中实现方法一部分原因是为了lambda表达式服务的&#xf…

Android Activity 生命周期中onStart()和onResume()的区别

首先了解Activity的四种状态 Running状态&#xff1a;一个新的Activity启动入栈后&#xff0c;它在屏幕最前端&#xff0c;处于栈的最顶端&#xff0c;此时它处于可见并可和用户交互的激活状态。 Paused状态&#xff1a;当Activity被另一个透明或者Dialog样式的Activity覆盖时的…

Android 原生ExoPlayer 解析

1.简述与应用范围 ExpPlayer是一个开源的&#xff0c;App等级的媒体API&#xff0c;它的开源项目包含了library和示例。 ExoPlayer相较于MediaPlayer有很多优点&#xff1a; 1. 支持基于http的移动流媒体协议&#xff0c;包括DASH&#xff0c;HSL&#xff0c;Smooth Stream。同…

Java8 Stream

概述 Java8 API中添加了一个新的抽象成为流Stream&#xff0c;可以以一种声明的方式处理数据。 Stream与java.io包中的InputStream和OutputStream是完全不同的概念。Java8中的Stream是对集合对象功能的增强&#xff0c;专注与对集合对象进行各种非常便利、高效的聚合操作&…

Java 注解原理

下面来看看Java中注解是如何实现的 创建注解类Inter: 创建测试类Test: 在程序第二句设置断点,可以看到: 可以看到,注解的实例是一个动态代理类的对象. 要想查看这个动态代理类,可以在代码中加 System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", …

myeclipse导入项目报错Target runtime Apache Tomcat v8.0 is not defined

今天想要查看一个现有的项目&#xff0c;本着最好使用原版本开发工具的奇怪想法&#xff0c;下载了一个myeclipse&#xff0c;在导入项目的时候报了一个错误 问题倒是挺明确的&#xff0c;就是项目需要的tomcat运行环境没有&#xff0c;有两种方法解决&#xff1a; 第一种方…

Android Studio查找功能(搜索功能)及快捷键

1、在当前窗口查找文本【CtrlF】 F3 向下查找关键字出现位置 ShiftF3 向上一个关键字出现位置 2、在当前工程内查找文本【CtrlShiftF】 先会弹出一个对话框&#xff0c;直接点击【find】&#xff0c;开始在整个工程内查找该字符串 查找结果如下&#xff1a; 3、查找类【C…

On the coexistence of transport protocols in data centers

论文信息&#xff1a;S. M. Irteza, A. Ahmed, S. Farrukh, B. N. Memon, and I. A. Qazi.On the coexistence of transport protocols in data centers. In Proceedings of IEEE ICC, 2014.数据中心传输协议的共存 摘要 云数据中心的出现直接导致了数据中心TCP&#xff08;D…

如何做科研20171206

昨日听董大一席话&#xff0c;感触颇多&#xff0c;今日在此进行记录。&#xff08;加粗字体为董大箴言&#xff09; ① 关于看论文 董大问我你最近看了什么论文&#xff0c;我说&#xff0c;论文的题目没有记下来&#xff0c;只记得主要讲了什么。我以前一直以为一篇论文的阅…

contiki cooja仿真

最近在做contiki平台上的一些cooja仿真的东西&#xff0c;发现现在网上能学到的东西实在是很有限&#xff0c;现在在这里将我最近学到的一些东西做一下总结。 一、 关于运行的一般步骤&#xff1a; https://www.zhihu.com/question/48708549/answer/139050874 知乎上这个问…

6大设计原则之单一职责原则

单一职责原则 如果有一个用户管理类,类图如下 我想,任谁也能看的出这个接口设计的有问题,用户的属性和用户的行为没有分开,应该把用户的信息抽取成一个业务对象,把用户的行为抽取成一个业务对象,按照这个思路对类图进行修正,如下图所示 其实,在实际使用中我们更倾向于使用两个…

6大设计原则之里氏替换原则

面对对象中的继承 优点如下: 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性提高代码的重用性子类可以形如父类,但又异于父类提高代码的可扩展性,很多开源框架的扩展接口都是通过继承父类来实现的提高产品或项目的开放性 缺点如下: 继承是侵入性的.只要继承,就…

6大设计原则之接口隔离原则

接口隔离原则的定义 什么是接口. 实例接口,比如定义了一个Person类,然后 Person p new Pserson(); 产生一个实例,Person类就是 p 的接口类接口,就是Java中使用 interface 定义的接口 什么是隔离 隔离要求将接口尽量细化,同时接口中的方法尽量少. 接口隔离原则的实现 比如…

论文写作——origin画图

一 origin的安装 详见下面网址&#xff0c;内涵下载路径和破解方法。 http://www.ddooo.com/softdown/51005.htm 1. 下载origin 网址&#xff1a;https://thepcgo.com/origin-pro-8-0-free-download/ 2.下载破解相关压缩包 链接&#xff1a;https://pan.baidu.com/s/1LwA…

论文写作——texstudio+texlive

一 安装 安装见下方链接 https://jingyan.baidu.com/article/63f236287febc50208ab3deb.html 二 使用 1、选择模板 IEEE: https://ieeeauthorcenter.ieee.org/create-your-ieee-article/use-authoring-tools-and-ieee-article-templates/ieee-article-templates/ ACM:…

论文写作——如何作图(visio/ppt+Adobe Acrobat Pro)

前言 在论文中&#xff0c;基本上的图都要求是矢量图&#xff0c;就是即使放大也不会失真。 .eps是最常被要求用的&#xff0c;然而我使用了各种方法&#xff08;可以试试在线转换格式&#xff0c;很方便&#xff09;都没能成功转成打得开看得见的.eps格式&#xff0c;又懒得…