java lambda表达式,java中lambda用法
这篇文章给你带来了一些关于java的知识,主要是关于Lambda表达式。Lambda表达式在Java语言中引入了一个运算符* * "-"* *,称为Lambda运算符或arrow运算符。下面就来看看吧,希望对你有帮助。
如何解决写爬虫IP受阻的问题?立即使用。
一、Lambda初识
我们知道在Java中,接口是不能实例化的,但是接口对象可以指向它的实现类对象。接口连实现对象都没有怎么办?您也可以使用匿名类,如下所示:
公共类JavaTest {
公共静态void main(String[] args) {
Fly fly=new Fly() {
@覆盖
公共void fly(字符串名称){
System.out.println(名为 flight );
}
};
Fly.fly(张三);
} }界面浮动{
抽象void fly(字符串名);}但是使用匿名内部方法,代码量其实不是很简洁。为了使代码更加简洁,Java引入了Lambda表达式的编写方法,并通过更简单的语法,来实现这一功能。使用Lambda表达式简化的代码如下:
公共类JavaTest {
公共静态void main(String[] args) {
fly fly=name-system . out . println(name flight );
Fly.fly(张三);
} }界面浮动{
抽象void fly(字符串名);}通过Lambda表达式达到同样的效果,但是代码量非常简化。这就是Lambda表达式的魅力。
二、 函数式接口
在学习Lambda表达式的语法之前,首先要知道函数式接口是什么。只有一个待实现方法的接口叫功能接口。
//接口中只有一个要实现的方法fly,所以这是函数接口interface Fly{
void fly(字符串名);}//接口中要实现两个方法。这是一个功能接口界面运行{
void fast run();
void slow run();}//接口中有两个方法,但其中一个是定义的默认方法。只有一个方法真正需要子类来实现。这是功能界面的界面跳转{
void jump();
默认void highJump(){
system . out . println( Jump high );
}}可以给接口添加**@FunctionalInterface注释,断言这个接口是一个函数接口。如果此接口不是功能接口,编译将提示错误。
为什么想知道什么是功能接口?因为Lambda expression简化了接口的匿名类实现,所以它只能在函数接口* *上工作。
这很好理解,如果一个接口有多个方法要实现,Lambda expression无法分辨它现在实现的是接口中的哪个方法。
三、Lambda表达式语法
Lambda表达式引入了一个运算符* * "-"* *,在Java语言中称为Lambda运算符或arrow运算符。它将Lambda分成两部分:
左侧:指定了Lambda表达式所需的所有参数。
右边:Lambda体,也就是Lambda表达式要执行的函数,公式化。
像这样:
(参数)-表达式
或者
(参数)-{语句;} Lambda表达式除了-和Lambda体之外,其他参数如参数、圆括号、中括号可以用更多的参数类型和方法体的代码行省略。
以下面这个功能接口的实现为例:
接口数学运算{
int运算(int a,int b);
}
界面问候服务{
void sayMessage(字符串消息);
}
private int operation(int a,int b,MathOperation mathOperation){
返回mathOperation.operation(a,b);
}
接口NoParam{
int return one();
}以下是lambda表达式的重要特性:
可选类型声明:Lambda表达式不需要声明实现方法的参数类型,编译器可以统一识别参数值。//类型声明
MathOperation加法=(int a,int b)-a b;
//没有类型声明
MathOperation减法=(a,b)-a-b;可选的参数圆括号:一个参数不需要定义括号,但是没有参数或者多个参数需要定义括号。//不带括号
greeting service greet service 1=message-
System.out.println(Hello 消息);
//使用括号
greeting service greet service 2=(message)-
System.out.println(Hello 消息);可选的大括号:如果主体包含语句,则不需要使用花括号。//多条语句中不能省略花括号。
MathOperation乘法=(int a,int b) - {
int num=a 1;
num=a b;
返回a * b编号;
};
//大括号可以在单个语句中省略
MathOperation pision=(int a,int b)-a/b;可选的返回关键字:如果主体只有一个表达式返回值,编译器会自动返回值,大括号需要指定表达式返回数值。//有多个语句的Lambda表达式,如果有返回值,需要使用return。
MathOperation乘法=(int a,int b) - {
int num=a 1;
num=a b;
返回a * b编号;
};
//单个语句可以省略return
MathOperation pision=(int a,int b)-a/b;
四、Lambda表达式的使用范围
Lambda表达式不仅用于简化匿名类的创建,还有很多用途。
1、为变量赋值
上一篇文章中,Lambda表达式都是为了给变量赋值而写的,可以简化匿名内部类赋值的代码段,提高读取效率。
MathOperation减法=(a,b)-a-b;
2、作为return结果
接口MathOperation {
int运算(int a,int b);
}
MathOperation getOperation(int a,int b){
return (a1,B1)-a b;
}
3、作为数组元素
MathOperation数学[]={
(a,b) - a b,
(a,b) - a-b,
(a,b)-a * b };
4、作为普通方法或者构造方法的参数
公共静态void main(String args[]){
Java 8 tester Java 8 tester=new Java 8 tester();
java8Tester.operate(1,2,((a,b)-a * b));
}
private int operation(int a,int b,MathOperation mathOperation){
返回mathOperation.operation(a,b);
}
接口数学运算{
int运算(int a,int b);
}:
五、Lambda表达式的作用域范围
在lambda表达式体内,可以访问表达式体外的变量,但不能修改其他变量。
六、Lambda表达式的引用写法
学习Lambda时,你可能还会发现一种奇怪的写法,比如下面这段代码:
//方法引用写成greeting service greeting service=system . out:println;
greeting service . say message( hello world );有一个符号:以前没见过。这种编写方法称为方法引用。
显然,使用方法引用比普通的Lambda表达式要简洁一点。
如果函数式接口的实现恰好可以通过调用一个方法来实现,那么我们可以使用方法引用。
公共类Java8Tester {
公共静态void main(String args[]){
//静态方法引用-由类名调用
greeting service greeting service=Test:myname static;
greeting service . say message( hello );
Test t=new Test();
//实例方法引用-由实例调用
greeting service greeting service 2=t:my name;
//构造方法方法引用-无参数
supplier Test supplier=Test:new;
system . out . println(supplier . get());
}
界面问候服务{
void sayMessage(字符串消息);
} }类测试{
//静态方法
public static void MyNameStatic(字符串名称){
System.out.println(名称);
}
//实例方法
public void myName(字符串名称){
System.out.println(名称);
}
//无参数构造方法
公共测试(){
} }
7、Lambda表达式的优缺点
优点:
更少的代码行-lambda表达式最大的好处之一就是减少了代码量。我们知道,lambda表达式只能用于函数接口。例如,Runnable是一个接口,所以我们可以很容易地应用lambda表达式。
通过将行为作为方法中的参数传递来支持顺序和并行执行-使用Java 8中的Stream API将函数传递给collection方法。现在,集合的职责是以顺序或并行的方式处理元素。
更高的效率-通过使用Stream API和lambda表达式,在集合批量操作的情况下,可以获得更高的效率(并行执行)。此外,lambda表达式有助于实现集合的内部迭代,而不是外部迭代。
缺点
运行效率-如果不使用并行计算,计算速度往往并不比传统的for循环快。(并行计算有时候需要预热才能显示出效率优势。)很难调试-Lambda表达式很难破点,对mode也不友好。不容易看懂-如果其他程序员没有学过Lambda表达式,那么代码对于其他语言的程序员来说并不容易理解(我之所以学Lambda表达式,是因为我看不懂同事写的Lambda表达式的代码)。建议学习:《java视频教程》以上是Java实例讲解的lambda表达式的详细内容。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。