变量不合法的表达式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,一经查实,立即删除!

相关文章

【原创】请不要对Boost Format使用Byte作为参数

曾几何时我们可以肆无忌惮的对sprintf传入BYTE等类型作为参数&#xff0c;只要你指定的为%D即可打印出对应的数字但是boost format不可以&#xff0c;当你发生类型截断&#xff0c;错误&#xff0c;异常&#xff0c;请尽快查看你传入的类型是否为Byte因为format会将GoByte当做c…

java中catch ()_有关java中的try{}catch(){}的讲解

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。本文链接&#xff1a;https://blog.csdn.net/qq_38225558/article/details/82054100try {可能出现异常的代码(包括不会出现异常的代码)} catch (Ex…

PAT (Advanced Level) Practise:1001. A+B Format

【题目链接】 Calculate a b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four digits). Input Each input file contains one test case. Each case contains a pair of i…

stderr java_如何使用Log4j将stdout和stderr写入/捕获到文件并使用Windows和Tomcat 5.5(Java)?...

我正在使用Windows 2008 R2和Apache Tomcat 5.5,以获取您的信息.STDOUT和STDERR可以通过Apache Tomcat属性自动记录,通过Logging选项卡 – >重定向Stdout和重定向Stderror文本框.但我想通过log4j来控制它.我正在尝试利用ConsoleAppender和TimeAndSizeRollingAppender class来…

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

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

java 命令行读取_Java:从控制台(console,命令行)读取字符 | 学步园

/*** 从控制台(console,命令行)读取字符&#xff1a;InputStreamReader(System.in)*/import java.io.IOException;import java.io.InputStreamReader;public class Test{public static void main(String[] args) throws IOException{StringBuffer sql null;sql sqlReaderFrom…

vector初始化

对vector对象来说&#xff0c;直接初始化的方式适用于3种情况&#xff1a;1.初始值已知且数量少&#xff1b;2.初始值是另一个vector对象的副本&#xff1b;3.所有元素的初始值都一样。此外还有一种更常见的情况是4.创建一个vector对象时并不清楚实际所需元素的个数&#xff0c…

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

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

javascript Date类型 学习笔记

1 创建一个新的日期对象&#xff0c;如果不带参数&#xff0c;则对象自动获得当前的日期和时间 var d new Date() 2 如果需要指定特定的日期&#xff0c;则可以通过Date.parse() 或者 Date().UTC(),返回时间戳作为 new Date()的参数 Date.parse() 用法&#xff1a; var time…

python如何访问私有变量_python – 从类访问私有模块变量

我正在尝试理解python范围规则.为此,我尝试从同一模块中的类访问“非常私有”变量bar "bar"_bar "underscore"__bar "double underscore"def foo():print barprint _barprint globals()["__bar"]print __barclass Foo:def __init__…

高斯消元学习

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度分秒…

Android GPS及地磁传感器 API

Android 提供的位置包括经纬度和时间戳&#xff0c;可选地包含高度和方位&#xff0c;高度以WGS84椭球体为参照&#xff0c;方位以真北为参考。 地磁传感器以磁北为北。有2种传感器可提供方位信息&#xff1a;地磁场&#xff08;Geomagnetic&#xff09;传感器和方向&#xff0…

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…

cocos2d-x Lua与OC互相调用

1. Lua 调用OC 先看例子&#xff1a; hello.lua: -- 点击回调函数local function notifymenuCallbackTest()local luaoc require(luaoc)local ok, ret luaoc.callStaticMethod("RemoteRequestRouter", "notifyWatch", {params1 "NOTIFICATION_TO_H…

coldwallet java eth_wallet-eth 以太坊代币钱包 助记词 私钥 keystore 转账

wallet-eth-androidwallet-eth 以太坊代币钱包 助记词 私钥 keystore 转账(bip39、bip32、bip44、web3j)生成钱包地址// 生成钱包地址Wallet wallet WalletManager.generateWalletAddress();// 根据助记词获取地址WalletManager.generateAddress(wallet.getMnemonic());// 通过…

Uva 10004(二分图的判定)

这题其实很简单的说&#xff0c;第一次用邻接表来存图 首先图的储存结构是结构体head数组。。。其实head数组保存的 struct node {int v;int next; }V[200*200]; 假设现在有u节点&#xff0c;v表示的是和他邻接的点&#xff0c;next保存的是v对应的编号&#xff0c;head数组保…

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

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