变量不合法的表达式JAVA_Java8中lambda表达式的语法,别人都会的,你还不会吗?「一」...

函数式编程

函数式编程是一种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。 函数式编程是"结构化编程"的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。

lambda表达式

JSR-335首次定义了在Java中使用lambda表达式的基本规范,当前的实现就是针对JSR-335规范的。 lambda表达式是一种紧凑的、传递行为的方式。Lambda表达式本质上是为了解决方便的将代码作为数据传递的难题。从本质上讲lambda表达式就是一种将行为参数化的操作。

在JDK8之前,需要利用匿名内部类来实现的传递行为的操作,现在可以用lambda表达式来实现了。 从编码的角度讲,lambda表达式是一个代码块,以及必须传入代码的变量规范。

由于规范基本一致,所以Java中的lambda表达式和JavaScript中的在使用上几乎完全一样。所差别的只是胖箭头和瘦箭头而已。当然由于语言特性的问题,两种lambda表达式的实际差距还是很大的,这种差距表现在:在Java中,lambda表达式本身是有类型的。也就是说要传递的行为必须是有类型的,这种类型就是函数接口。

除了传参之外,lambda表达式也可以出现在赋值符号的右边。

lambda表达式的语法: lambda表达式由参数、箭头、表达式组成。

(parameters) -> expression //此处行为为表达式,这里隐含了return语句。

或者

(parameters) -> { statements; } //此处行为为语句,需要返回时要手写return语句。

1,如果代码无法在一个表达式中完成,可以像写方法一样把代码放在大括号中。只有一行代码的Lambda表达式也可以使用大括号。

()->{

...

}

2,没有参数时,也要提供一个空的小括号。如果只有一个参数,而且这个参数的类型可以推导,也可以省略小括号。Lambda表达式也可以包含多个参数

(param)->expression

param->expression

3,大部分情况中,无需指定lambda表达式的返回类型。具体的返回类型可以由上下文推断得出。

这种类型推导实际上是Java7中的目标类型推断的扩展。在Java7中以下代码是合法的,这是泛型的又一个升级。

Map map=new HashMap<>(); //不用声明HashMap的中的键值对类型,系统可以通过Map的相关类型推断出来。

这就是所谓的类型推断。

4,lambda表达式中只在某些分支返回值,另一个些分支不返回值是不合法的。

5,与JavaScript相同,lambda表达式只有一个入参时,可以省略小括号。

example:

BinaryOperator add=(x,y)->x+y; //创建一个函数,用来计算x和y相加的结果。

注意:add不是两个数字的和,而是将两个数字加相的那行代码。

System.out.println(add.apply(1l,2l)); //打印3

解析:binaryOperator是一个接口,其含义进行一次两数据的某种操作,并返回这个操作的结果。其抽象方法来自父接口BiFunction。BiFunction接口是不同数据类型的操作、而binaryOperator接口是针对相同类型数据的操作。

public interface BiFunction {

R apply(T t, U u);

}

public interface BinaryOperator extends BiFunction{}

需要注意的是: Lambda表达式中引用的在表达式之外定义的局部变量必须是final或既成事实上的final变量。 这个约束性的规定来源于java 8之前的匿名内部类,java 8放宽了这个规定,既局部变量可以不加final关键字,但依然不能给该变量多次赋值。

函数接口

函数接口是只有一个抽象方法的接口,用作Lambda表达式的类型。也就是说所谓的Lambda表达式对应的其实就是函数接口。 java8提供@FunctionalInterface注解函数接口,当然这个注解是非必须的,只要接口符合函数接口的标准(即只包含一个抽象方法的接口)即可。 函数式接口的抽象方法签名基本上就是Lambda表达式的签名,这种抽象方法叫作函数描述符。 几个重要的函数式接口,它们都位于java.util.function包中:

Predicate接口

@FunctionalInterface

public interface Predicate{

boolean test(T t);

}

Consumer接口

@FunctionalInterface

public interface Consumer{

void accept(T t);

}

BiConsumer接口

@FunctionalInterface

public interface BiConsumer {

void accept(T t, U u);

}

Function接口

@FunctionalInterfac

public interface Function{

R apply(T t);

}

为避免在使用原始类型时进行自动拆、装箱操作,jdk8提供了以上函数式接口的原始类型版本。

IntPredicate、DoublePredicate等

Supplier接口

@FunctionalInterface

public interface Supplier {

T get();

}

BinaryOperator接口

BinaryOprator接口继承自BiFunction接口,其接口方法源型如下:

R apply(T t, U u);

方法引用

方法引用是lambda表达式的一种简化写法。当要调用的方法是一个已经存在的方法时可以使用方法引用。使用方法引用替换整个Lambda表达式。 语法为:左边是容器(可以是类名,实例名),中间是"::",右边是相应的方法名(不带小括号)。

ObjectReference::methodName

一般方法的引用格式:

调用静态方法,ClassName::methodName。如 Person::compareByAge调用实例方法,Instance::methodName。如System.out::println;调用参数的实例方法,ClassName::methodName。Object::equals;调用构造方法,ClassName::new 。如:Person::new;注意:

当匿名方法有参数并且lambda表达式就是调用参数中的方法的时候,可以直接用参数的类名做为容器。如下:

List collected=Stream.of("a","b","hello")

.map(string->string.toUpperCase)

.collect(Collectors.toList());

//注意这里使用了方法引用

List collected=Stream.of("a","b","hello")

.map(String::toUpperCase)

.collect(Collectors.toList());

本质上讲:方法引用是Lambda表达式的快捷写法。当这个Lambda表达式代表的只是直接调用某个已经存在的方法时使用。

可以把方法引用当作针对仅涉及单一方法的Lambda的语法糖。

forExample:

public class LambdaExample {

public static void main(String[] args) {

List names = Arrays.asList("peter", "anna", "mike", "xenia");

/*匿名内部类的方式

Collections.sort(names, new Comparator() {

@Override

public int compare(String a, String b) {

return b.compareTo(a);

}

});

*/

/*lambda表达式

Collections.sort(names, (a,b) -> {

return b.compareTo(a);

});

*/

//简易写法

Collections.sort(names, (a, b) -> b.compareTo(a));

//进一步简写

Collections.sort(names,String::compareTo);

for(String s:names){

System.out.println(s);

}

}

}

public class ThreadExample {

public static void main(String[] args) {

Thread thread=new Thread(()->{

for(int i=0;i<10;i++){

System.out.println(i);

}

});

thread.start();

}

}

每一个lambda表达式都对应一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为默认方法不算抽象方法,所以你也可以给你的函数式接口添加默认方法。 我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接口一定达到这个要求,你只需要给你的接口添加 @FunctionalInterface 注解,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。

@FunctionalInterface

interface Converter {

T convert(F from);

}

Converter converter = (from) -> Integer.valueOf(from);

Integer converted = converter.convert("123");

System.out.println(converted); // 123

下一篇lambda2讲解具体的API语法,以及应用场景。

Java8中lambda表达式的语法,别人都会的,你还不会吗?「二」

a7917b4a2c8d2ab711cf5e632886ec34.png

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

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

相关文章

动手制作属于你自己的WIN PE3.0

最近想要更新公司的网Ghost系统&#xff0c;所以小研究一下win pe &#xff0c;在网上看见一个很不错的教程&#xff0c;在这里分享给大家&#xff01;并非原创&#xff0c;纯属转载&#xff01;&#xff01;O(∩_∩)O~天缘的作品&#xff0c;很是佩服这个哥们啊.....一、WINPE…

python图像处理模糊_Python+OpenCV图像处理之模糊操作

模糊操作是图像处理中最简单和常用的操作之一&#xff0c;该使用的操作之一原因就为了给图像预处理时减低噪声&#xff0c;基于数学的卷积操作均值模糊&#xff0c;函数 cv2.blur(image,(5,5))&#xff0c;这是一个平滑图片的函数&#xff0c;它将一个区域内所有点的灰度值的平…

高斯消元学习

1. 证明XOR满足交换律&#xff0c;结合律&#xff0c;是自身的逆运算。比如说&#xff0c;1^0 1 1^1 0 0^1 1 0^0 01^1^0 0 1^0^1 0.a^b^ab 即一个数异或两次相当于无效 2. 从N个数中选出两个数&#xff0c;使XOR和最大。解法&#xff1a;我们知道两个数字之间的异或…

java经纬度格式_java经纬度格式转换

在数学中&#xff0c;表示角度的度、分、秒分别使用、′、″符号进行表示。160′&#xff0c;1′60″ &#xff0c;13600″。由上述可知度分秒转换度的计算公式为&#xff1a;(ddmm′ss″) ddmm/60ss/3600如&#xff1a;11330′10.25″ 11330/6010.25/3600 ≈113.502847度分秒…

e3是合法浮点数吗_下面4个选项中,均是合法浮点数的选项是?

选B。b中的123是整数&#xff0c;不是浮点数&#xff0c;2e4.2的指数是4.2不满足浮点数的规则必须是整数&#xff0c;e5中的e不满足浮点数的规则&#xff0c;所以b中3个数均不是浮点数。a中的160、0.12是正确的&#xff0c;c中的123e4、0.0是正确的&#xff0c;d中的234、1e3是…

winform 菜单激发窗体切换做法

经常会用到类似于下图这样的winform窗体&#xff0c;其中点击各个菜单时于鏊做到内容窗体的切换&#xff0c;今天也记录一直切换的方法 在主窗体放置一个panal&#xff0c;所有的内容窗体均在改panal上呈现&#xff0c;实现以下方法 ///实例化主窗体 private void FrmSetup_Loa…

java 正则表达式 反向_正则表达式中的数量表示符、反向引用、零宽断言、以及java中的用法...

在表示数量时&#xff0c;如果一个正则表达式X&#xff0c;后面没有加表示数量的符号&#xff0c;那就默认出现一次。如果指定需要出现n次&#xff0c;那就用{n}&#xff0c;例如a{n},就是匹配a出现n次的。a{n,}表示a出现至少n次的&#xff0c;而这个时候就会默认是贪婪模式&am…

django配置在MySQL_怎么在Django中安装与配置mysql

怎么在Django中安装与配置mysql发布时间&#xff1a;2021-02-26 17:42:11来源&#xff1a;亿速云阅读&#xff1a;57作者&#xff1a;Leah本篇文章为大家展示了怎么在Django中安装与配置mysql&#xff0c;内容简明扼要并且容易理解&#xff0c;绝对能使你眼前一亮&#xff0c;通…

Java字符串找出4个字节长度的字符

不解释&#xff0c;直接上代码&#xff1a; 由于Iteye代码贴四个字节的&#xff35;&#xff34;&#xff26;&#xff0d;&#xff18;字符出错&#xff0c;特能图的方式发布几个特殊字符&#xff1a; Java代码 public class Byte4Check { public static void main…

div 左右并排,使用CSS如何让两个div并排显示

用CSS如何让两个DIV盒子并排体现呢&#xff1f;各人知道默认情况下DIV是独占一排的&#xff0c;DIV不设置任何CSS格局&#xff0c;这个DIV盒子都邑独有一行踊跃换行。运用CSS让两个DIV并排闪现&#xff0c;排成一排显示思空见贯方式有两种&#xff1a;1、运用display:inline2、…

JStorm-介绍

1.概述 JStorm 是一个类似于 Hadoop 的MapReduce的计算系统&#xff0c;它是由Alibaba开源的实时计算模型&#xff0c;它使用Java重写了原生的Storm模型&#xff08;Clojure和Java混合编写的&#xff09;&#xff0c;并且再原来的基础上做了许多改进。用户只需按照指定的接口实…

又一个绝对棒的对话框插件fancybox v1.3.4

http://www.jsfoot.com/jquery/demo/2011-07-30/fancybox/index.html jquery插件&#xff1a;fancybox Fancybox的特点如下&#xff1a; 可以支持图片、html文本、flash动画、iframe以及ajax的支持可以自定义播放器的CSS样式可以以组的形式进行播放如果将鼠标滚动插件&#xff…

php this validate,php扩展ZF——Validate扩展

php扩展ZF——Validate扩展更新时间&#xff1a;2008年01月10日 20:27:49 作者&#xff1a;php扩展ZF——Validate扩展之前写了一片文章关于如何在ZF0.6版本下扩展ZF的。这篇应该说是类似的文章&#xff0c;但环境换成ZF1.0RC1版本了。在开始ZF扩展之前&#xff0c;推荐先看看…

浅谈数据结构-选择排序(简单、堆排序)

选择排序&#xff1a;每趟从待排序的记录中选出关键字最小的记录&#xff0c;顺序放在已排序的记录序列末尾&#xff0c;直到全部排序结束为止。 选择排序正如定义所讲&#xff0c;在数组查询出最小值&#xff0c;然后放在此次循环开始位置&#xff08;前一次循环已经获取比它更…

安装php7的mysql扩展,php7安装mysql扩展的方法是什么

php7安装mysql扩展的方法&#xff1a;1、下载mysql扩展并解压&#xff1b;2、使用phpize工具初始化并进行configure&#xff1b;3、执行【make && make install】命令&#xff1b;4、编辑php.ini文件&#xff1b;5、重启服务。本文环境&#xff1a;windows10系统、php7…

iPhone屏幕尺寸、分辨率及适配

目录(?)[-] iPhone尺寸规格单位inch英吋iPhone手机宽高屏幕尺寸像素密度PPI缩放因子scale factor between logic point and device pixel1Scale起源 2UIScreenscale 3UIScreennativeScale 4机型判别Resolutions Rendering2x3x以及高倍图适配12x 23x 3高倍图文件…

鼠标移动响应php程序,jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】...

本文实例讲述了jQuery实现的响应鼠标移动方向插件用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;HTML代码如下&#xff1a;www.jb51.net jQuery响应鼠标移动*{margin:0;padding:0;}ul,li{list-style:none;}div{font-family:"Microsoft YaHei";}html,bo…

jitpack让使用第三方依赖库更简单

在开发过程中&#xff0c;使用第三方优秀依赖库是个很常见的问题&#xff0c;有的时候是maven&#xff0c;或者gradle, 或者sbt,大部分库工程&#xff0c;都会有对应的gradle,maven依赖代码&#xff0c;但是有的没有&#xff0c;尤其是使用的snapshot的依赖的时候&#xff0c;虽…

Swift - 发送消息(文本,图片,文件等)给微信好友或分享到朋友圈

通过调用微信提供的API接口&#xff0c;我们可以很方便的在应用中发送消息给微信好友&#xff0c;或者分享到朋友圈。在微信开发平台&#xff08;https://open.weixin.qq.com&#xff09;里&#xff0c;提供了详细的说明文档和样例。但由于提供的样例是使用Objective-C写的&…

linux怎么改程序图标,如何在Ubuntu Unity上修改应用程序图标

这篇文章将教大家在Ubuntu Unity上修改应用程序图标&#xff0c;这个教程适合于Ubuntu 14.04, Ubuntu 13.10, Ubuntu 12.04 等使用Unity作为默认桌面环境的发行版。在Unity桌面环境&#xff0c;程序启动器实际上以.desktop为后缀的文件的形式存储在电脑上&#xff0c;所以我们可…