详解Java中的Lambda表达式_java

来源:脚本之家  责任编辑:小易  

switch(expression){case label:statementlistcase label:statementlistdefault:statementlist}当expression和所有的label 不匹配的时候,就执行default 语句。比如程序这么改写switch(“橘子”){case“香蕉”:输出:我爱吃香蕉!case“苹果”:输出:我爱吃苹果default:输出:我爱吃水果}因为“橘子”和“香蕉”,“苹果”都不匹配,所以就执行 default 语句。程序不规范,仅为了说明 default 语句www.zgxue.com防采集请勿采集本网。

Java 目前已经出到13的版本,但是国内大部分公司应该都停留在 Java 8 的版本(不敢承担升级带来的风险)。在Java8中给我们带来了 Lambda表达式和Stream流式操作,提供了函数式编程和简化批处理操作。可能大家日常使用很多,但是很少去关注Lambda 和 Stream实现。本篇就带着大家一起关注这两块知识,搬好小板凳我们一起看电视。

多态是面向对象的核心之一,面向接口编程也是以面向对象编程为核心。接口就是一种规范,我们平时编程要融入生活,比如说电脑的主板,上面有很多接口,插CPU得接口只要插上CPU就可以工作,不管它

什么是Lambda

但是这样就破坏掉了容器的封装—容器角色就要公开自己的私有属性,在java中便意味着向其他类公开了自己的私有属性。那我们把它放到容器角色里来实现好了。这样迭代器角色就被架空为仅仅存放一个遍历当前

简单来说,编程中提到的 lambda 表达式,通常是指需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。

解释下画红线部分如下: 1、cacheMap.keySet().iterator();这句代码的意思是得到cacheMap这个Map集合的迭代器(且是key集合的迭代器,因为Map集合是由key和value组成的);这行下面的代码通过得到

一般我们使用变量来进行赋值操作:

就是调用类中的e5a48de588b6e799bee5baa631333365646239方法,最简单的用法是可以把方法参数化,invoke(class,method)比如你Test类里有一系列名字相似的方法setValue1、setValue2等等。可以把

但是在 Java8 之前是没有提供将一个方法赋值给一个变量的操作:

正确格式应该如下: {\"mobiles\":[\"1387123456\",\"139123456\"]}

在 JavaScript 中有 闭包的概念,所以 Java不甘落后,也去学习了人家,搞出了匿名函数的概念。

在Java 8里面,所有的Lambda的类型都是一个接口,而Lambda表达式本身,也就是”那段代码“,需要是这个接口的实现。这是我认为理解Lambda的一个关键所在,简而言之就是,Lambda表达式本身就是一个接口的实现。

基本语法:

(parameters) -> { expression or statements }

示例:

// 无参数, 返回1+2的结果() -> 1+2;// 接收一个参数(数字类型),返回其2倍的值x -> 2 * x;// 接收2个参数(数字),返回表达式运算的结果(x, y) -> x + y;// 多个语句要用大括号包裹, 并且返回值要用return指明(x, y) -> {int result = x + y;System.out.print(result);return result;};

Lambda表达式有如下约定: 一个 Lambda 表达式可以有零个或多个参数; 参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)与(a)效果相同; 所有参数需包含在圆括号内,参数之间用逗号相隔。例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c); 空圆括号代表参数集为空。例如:() -> 42; 当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a; Lambda 表达式的主体可包含零条或多条语句; 如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致; 如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空。

@FunctionalInterface 是 Java 8 新加入的一种接口,用于指明该接口类型声明是根据 Java 语言规范定义的函数式接口。Java 8 还声明了一些 Lambda 表达式可以使用的函数式接口,当你注释的接口不是有效的函数式接口时,可以使用 @FunctionalInterface 解决编译层面的错误。

根据定义,函数式接口只能有一个抽象方法,如果你尝试添加第二个抽象方法,将抛出编译时错误。例如:

@FunctionalInterfacepublic interface DoSomethingInterface { void doSomeThing(); void doSomeThing1();}

举一个简单使用的例子,首先定义一个接口:

@FunctionalInterfacepublic interface DoSomethingInterface<T> { String doSomeThing(T t);}

这个接口里面只能有一个函数,接口里是返回值为String类型的方法,那么下面使用它的时候就需要有返回值:

class MainTest{ public static void main(String[] args) { DoSomethingInterface<String> t = str -> { return str; }; String print = t.doSomeThing("print"); System.out.println(print); }}

t就相当于是接口的具体实现,那么使用 t.doSomeThing("print")就会去调用 t 的匿名函数执行。从这段代码看,如果我们有一个抽象类的具体实现逻辑相对简单不用大段代码的时候,可以使用 Lambda 表达式去实现具体的逻辑,这样就不用new 多个类。

Java 8 内置4大核心函数式接口

大家日常使用的List,Map,肯定大量使用了Stream流式处理,在流式处理中大量使用了Lambda,比如List的foreach方法就使用了Lambda表达式。Java8中抽象出来4类基本的函数式接口,日常开发中我们其实也是可以使用的。

函数式接口 参数类型 返回类型 用途
Consumer T Void void accept(T t) :将T 类型的参数应用于该方法
Supplier T T T get():返回类型为T 的对象
Function<T,R> T R R apply(T t):输出T类型的参数返回R类型的结果
Predicate T Boolean boolean test(T t): 确定类型为T 的参数是否满足test逻辑

以上4种类型是Java默认提供的Lambda类,开箱即用。

Consumer使用:

public void test(){ save(user, t->{ saveUser(t); });}public void save(User user, Consumer<User> consumer){ consumer.accept(user);}

Supplier使用:

public void test(){ Config config = getConfig(t -> { return getAllConfig(t); });}public Config getConfig(Supplier<Config> supplier) { return supplier.get();}

Function使用:

public void test(){ User user = getUser(t -> { return getUserByName(t); });}public User getUser(Function<String, User> function) { return function.apply(t);}

Predicate使用:

public void test(){ boolean b = checkStatus(user, t -> { return checkUserExist(t); });}public boolean checkStatus(User user, Predicate<User> predicate) { return predicate.test(user);}

以上关于Lambda就介绍到这里,大家应该明白了它是干啥的了吧。闭包是不是也没有这么难懂呢!联想到List的foreach使用,大家有没有冲动想自己实现一个Lambda在日常开发中炫一把(如果别人看不懂,会打你的)。

到此这篇关于详解Java中的Lambda表达式的文章就介绍到这了,更多相关Java中的Lambda表达式内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

主要区别不在于lambda和method reference,而是在于捕获与非捕获,而捕获的东西是否可以序列化。详细解析请网上查找内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • java8之lambda表达式用法总结
  • java lambda表达式实现flink wordcount过程解析
  • java lambda表达式用法总结
  • java lambda表达式与匿名内部类的联系和区别实例分析
  • java lambda表达式的方法引用和构造器引用实例分析
  • pl/sql实现java中的split()方法的例子
  • java 工厂模式的实例详解
  • java 添加、修改、读取、复制、删除excel批注的实现
  • javaweb 使用session实现一次性验证码功能
  • java找不到或无法加载主类及编码错误问题的解决方案
  • java实现的百度语音识别功能示例
  • java程序去调用并执行shell脚本及问题总结(推荐)
  • flutter 通过clipper实现各种自定义形状的示例代码
  • 掷6面骰子6000次每个点数出现的概率
  • spring boot 开发soap webservice的实现代码
  • Java中普通lambda表达式和方法引用本质上有什么区别
  • Java中的default语句详解?????
  • java "九九乘法表“详解
  • java中hallo word怎么编写?求详解!
  • 求详解java中的接口与多态
  • java中iterator()方法详解
  • 大神们,请详解一下下图中的java代码,尤其是红色区域的意思以及用法,先谢谢了~
  • java中的反射,invoke方法详解
  • java解析Json,数组括号内的大括号 {'mobiles': [{'1387123456','139123456'}]}
  • java8的lamda有什么意义
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全c#教程vbvb.netc 语言java编程delphijavaandroidiosswiftscala易语言汇编语言其它相关首页java8之lambda表达式用法总结java lambda表达式实现flink wordcount过程解析java lambda表达式用法总结java lambda表达式与匿名内部类的联系和区别实例分析java lambda表达式的方法引用和构造器引用实例分析pl/sql实现java中的split()方法的例子java 工厂模式的实例详解java 添加、修改、读取、复制、删除excel批注的实现javaweb 使用session实现一次性验证码功能java找不到或无法加载主类及编码错误问题的解决方案java实现的百度语音识别功能示例java程序去调用并执行shell脚本及问题总结(推荐)flutter 通过clipper实现各种自定义形状的示例代码掷6面骰子6000次每个点数出现的概率spring boot 开发soap webservice的实现代码java使double保留两位小数的多方java8 十大新特性详解java.net.socketexception: connjava写入文件的几种方法分享java环境变量的设置方法(图文教程java 十六进制与字符串的转换java list用法示例详解java中file类的使用方法javaweb实现文件上传下载功能实例java 字符串截取的三种方法(推荐java驼峰转换的方法java几种常用json库性能比较详解29个要点帮你完成java代码优化java实现把两个数组合并为一个的方法总结java实现区域内屏幕截图示例java optional实践(小结)解决idea2020.1版本不兼容lombok的问题jsoup获取全国地区数据属性值(省市县镇村百度java面试题 前200页精选(上)java经典排序算法之归并排序详解
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved