Lambda表达式的语法与如何使用Lambda表达式
Lambda表达式是对象,是一个函数式接口的实例
如何来写Lambda表达式?
- 看参数
- 看返回值
代码实例1:
package day2; import jdk.nashorn.internal.codegen.CompilerConstants; import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.function.Function;
import java.util.function.UnaryOperator; /**
* @auther hhh
* @date 2018/12/27 21:32
* @description
*/
public class LambdaExpress {
/**
* Lambda 表达式语法:
* args -> expr (左边是参数,右边是表达式)
* 或者 (Object...args )->{函数式接口抽象方法的实现逻辑}
* ()里面参数的个数,根据函数式接口里面的抽象方法的参数个数来决定
* 只有一个参数的时候,()可以省略
* 当expr逻辑非常简单的时候,{}和return都可以省略
*/
/**
* 表达式示例:
* () -> {} //无参,无返回值
* () -> {System.out.println(1);} //无参,无返回值
* () -> System.out.println(1)//无参,无返回值,上面的简写,将{}省略
* () -> {return 100;} //无参有返回值
* () -> return 100; // 无参又返回值
* () -> null ; //无参又返回值,返回null
* (int x) -> {return x+1;} //单参,有返回值
* (int x) -> return x+1;
* (x) -> x+1 //单参,又返回值(不指定参数类型,多个参数必须用括号)
* x -> x+1 //单参数,有返回值(不指定参数类型)
*/
/**
* 注意事项:(以下实现是错误的)
* (x,int y) -> x+y (不能部分省略)
* (x,final y) -> x+y (参数不能使用final修饰符)
* Object o = () -> "hello" (不能将Lambda表达式赋值给一个非函数式接口)
* Object obj = (Supplier<?>)() ->"hello" (不需要也不允许使用throws语句来声明他可能会抛出的异常)
*/
public static void main(String[] args) throws Exception {
//语法:LambdaParameters -> LambdaBody (返回值必须是函数式接口)
Runnable r1 = () -> System.out.println("r1");
Runnable r5 = () -> {
System.out.println("r5");
};
//不是用lambda表达式
Runnable r4 = new Runnable() {
@Override
public void run() {
System.out.println("r4");
}
};
r1.run();
r4.run();
Runnable r2 = null;
Runnable r3 = () -> {
}; Callable<String> call1 = new Callable<String>() {
@Override
public String call() throws Exception {
return "不适用lambda";
}
};
Callable<String> call2 = () -> {
return "使用lambda;";
};
Callable<String> call3 = () -> "使用lambda简化,不需要人return与{}";
//call2 中的call方法是在函数式接口中实现的
System.out.println(call1.call() + "===" + call2.call() + "===" + call3.call()); UserMapper userMapper = new UserMapper() {
@Override
public void insert(User user) {
System.out.println(" insert user");
}
};
UserMapper u2 = (User user) -> System.out.println("use lambda insert user");
userMapper.insert(new User());
u2.insert(new User());
OrderMapper orderMapper = new OrderMapper() {
@Override
public int insert(Order order) {
return 1;
}
};
OrderMapper o1 = (Order order) -> 1;
OrderMapper o2 = (order) -> {
return 1;
};
OrderMapper o3 = (Order order) -> {
return 1;
};
//省略参数类型
OrderMapper o4 = (order) -> 1; //Function<T,R> 代表一个输入一个输出,一般输入输出是不同类型
Function<Integer, Integer> f1 = (a) -> {
int sum = 0;
for (int i = 1; i <= a; i++) {
sum += i;
}
return sum;
};
//UnaryOperator<T> 继承自Function<T,R>一般输入输出是同种类型,因为输入输出是同种类型,所以之传了一个参数,省略输出类型
UnaryOperator<Integer> unaryOperator = (a) -> {
int sum = 0;
for (int i = 0; i < a; i++) {
sum += a;
}
return sum;
};
System.out.println("sum = " + f1.apply(10));
System.out.println("sum = " + unaryOperator.apply(10));
//尝试使用for循环进行遍历
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
UnaryOperator<List<Integer>> unaryOperator2 = (l) -> {
for (Integer i : list) {
list.set(i - 1, i + 1);
}
return list;
};
System.out.println(unaryOperator2.apply(list));
}
} interface UserMapper {
void insert(User user);
} class User {
} interface OrderMapper {
int insert(Order order);
} class Order {
}
代码实例2:
package day2; import javax.sound.midi.Soundbank; /**
* @auther hhh
* @date 2018/12/27 22:32
* @description
*/
public class LambdaExpre2 {
static int get() {
System.out.println(1);
return 1;
} static void set() {
} static String find() {
return "";
} public static void main(String[] args) throws Exception {
/**
* 方法的返回值不是一定会返回,具体是有函数式接口的抽象方法决定的
* 实现的函数式接口没有返回值,调用的方法的值就不会被返回
* Runnable 中方法的实现为 public abstract void run(); 没有返回值
* 函数式接口只管执行方法,不管没有有返回值
*/
//Runnable 调用自定义的方法不会报错,但是Runnable方法为什么不报错呢?
Runnable r1 = () -> get();
Runnable r2 = () -> set();
// Runnable r3 = () -> 100; 不行,因为在Runnable实现的抽象方法中没有返回值,强制返回报错 r1.run();//无输出,说明值没有被返回 //Fun方法在调用set()的时候会报错,是因为Fun中定义的get()方法需要有返回值,而set()方法没有返回值
Fun f1 = () -> get();
System.out.println(f1.get());
Fun f2 = () -> 100;
Fun f3 = () -> 1 > 5 ? 1 : -1;
Fun f4 = () -> true ? 1 : -1;
// Fun f2 = () -> set();
// Fun f3 = () -> find();返回值类型必须一致
}
} interface Fun {
int get();
}
package day2; import javax.sound.midi.Soundbank; /**
* @auther hhh
* @date 2018/12/27 22:32
* @description
*/
public class LambdaExpre2 {
static int get() {
System.out.println(1);
return 1;
} static void set() {
} static String find() {
return "";
} public static void main(String[] args) throws Exception {
/**
* 方法的返回值不是一定会返回,具体是有函数式接口的抽象方法决定的
* 实现的函数式接口没有返回值,调用的方法的值就不会被返回
* Runnable 中方法的实现为 public abstract void run(); 没有返回值
* 函数式接口只管执行方法,不管没有有返回值
*/
//Runnable 调用自定义的方法不会报错,但是Runnable方法为什么不报错呢?
Runnable r1 = () -> get();
Runnable r2 = () -> set();
// Runnable r3 = () -> 100; 不行,因为在Runnable实现的抽象方法中没有返回值,强制返回报错 r1.run();//无输出,说明值没有被返回 //Fun方法在调用set()的时候会报错,是因为Fun中定义的get()方法需要有返回值,而set()方法没有返回值
Fun f1 = () -> get();
System.out.println(f1.get());
Fun f2 = () -> 100;
Fun f3 = () -> 1 > 5 ? 1 : -1;
Fun f4 = () -> true ? 1 : -1;
// Fun f2 = () -> set();
// Fun f3 = () -> find();返回值类型必须一致
}
} interface Fun {
int get();
}
代码实例3:
package day2; import java.util.function.BiFunction;
import java.util.function.Function; /**
* @auther hhh
* @date 2018/12/27 22:50
* @description
*/
public class BiFuncationTest {
public static void main(String[] args) {
//写任何函数式接口(Lambda)先把格式写好,重点是方法参数与返回值
//BiFunction<T, U, R> b = (参数,因为有两个输入参数,()一定不能省略)->{执行方法,若方法直接返回课省略{}};
//BiFunction 代表两个输入一个输出
BiFunction<String, String, Integer> biFunction = (a, b) -> a.length() + b.length();
System.out.println(biFunction.apply("sadfasdf", "fasdfsdaf"));
BiFunction<Integer, Integer, String> biFunction2 = (a, b) -> {
//编写具体代码逻辑
return "";
};
//输入String,输出Integer
Function<String, Integer> function = a -> a.length();
}
}
package day2; import java.util.function.BiFunction;
import java.util.function.Function; /**
* @auther hhh
* @date 2018/12/27 22:50
* @description
*/
public class BiFuncationTest {
public static void main(String[] args) {
//写任何函数式接口(Lambda)先把格式写好,重点是方法参数与返回值
//BiFunction<T, U, R> b = (参数,因为有两个输入参数,()一定不能省略)->{执行方法,若方法直接返回课省略{}};
//BiFunction 代表两个输入一个输出
BiFunction<String, String, Integer> biFunction = (a, b) -> a.length() + b.length();
System.out.println(biFunction.apply("sadfasdf", "fasdfsdaf"));
BiFunction<Integer, Integer, String> biFunction2 = (a, b) -> {
//编写具体代码逻辑
return "";
};
//输入String,输出Integer
Function<String, Integer> function = a -> a.length();
}
}
Lambda表达式的语法与如何使用Lambda表达式的更多相关文章
- Kotlin语法(函数和lambda表达式)
三.函数和lambda表达式 1. 函数声明 fun double(x: Int): Int { } 函数参数是用 Pascal 符号定义的 name:type.参数之间用逗号隔开,每个参数必须指明类 ...
- Lambda表达式的语法格式
Lambda表达式的语法格式: 参数列表 => 语句或语句块 “Lambda表达式”是委托的实现方法,所以必须遵循以下规则: 1)“Lambda表达式”的参数数量必须和“委托”的参数数量相同: ...
- Lambda表达式 简介 语法 示例
Lambda 表达式也称为闭包,是匿名类的简短形式.Lambda 表达式简化了[单一抽象方法声明接口]的使用,因此 lambda 表达式也称为功能接口. 在 Java SE 7 中,单一方法接口可使用 ...
- 1.2 lambda 表达式的语法
1.2 lambda 表达式的语法 还以上一节中的排序为例.我们传递代码来检查某个字符串的长度是否小于另一个字符串的长度,如下所示: Integer.compare(first.length(), s ...
- JDK8新特性02 Lambda表达式02_Lambda语法规则
//函数式接口:只有一个抽象方法的接口称为函数式接口. 可以使用注解 @FunctionalInterface 修饰 @FunctionalInterface public interface MyF ...
- Lambda表达式 简介 语法 示例 匿名内部类
在AS中使用 Lambda 表达式 Demo地址:https://github.com/baiqiantao/MultiTypeTest.git Gradle(Project级别)中添加classpa ...
- 【Java8新特性】Lambda表达式基础语法,都在这儿了!!
写在前面 前面积极响应读者的需求,写了两篇Java新特性的文章.有小伙伴留言说:感觉Lambda表达式很强大啊!一行代码就能够搞定那么多功能!我想学习下Lambda表达式的语法,可以吗?我的回答是:没 ...
- Java 终于有 Lambda 表达式啦~Java 8 语言变化——Lambda 表达式和接口类更改【转载】
原文地址 en cn 下载 Demo Java™ 8 包含一些重要的新的语言功能,为您提供了构建程序的更简单方式.Lambda 表达式 为内联代码块定义一种新语法,其灵活性与匿名内部类一样,但样板文件 ...
- 死磕Lambda表达式(一):初识Lambda
弱小和无知不是生存的障碍,傲慢才是.--<三体> 什么是Lambda表达式 Lambda表达式是表示可传递匿名函数的一种简洁方式,Lambda表达式没有名称,但是有参数列表.函数主体.返回 ...
随机推荐
- 什么是封装? ----------------php中"public"类似的访问修饰符分别有什么作用?----什么是抽象?抽象的关键字以及用法----- 什么是接口?接口的关键字以及用法-------------
什么是封装? ------------------------------------封装是php面向对象的其中一个特性,将多个可重复使用的函数封装到一个类里面.在使用时直接实例化该类的某一个方法,获 ...
- Nginx配置虚拟机,url重写,防盗链
配置目录: · 虚拟主机 · PHP支持 · URL重写 · 防止盗链 · 持续更新… 一.虚拟主机 1.创建 文件格式:{域名}.conf 具体如下: $ s ...
- memcached 相关
今天用了下memcached,把一个日志分析结果的大数组缓存起来,由于实时性跟准确性要求不高,所以缓存一周:因为日志越来越多,不缓存的话每次查看页面会比较慢.(其实可以先离线定期计算好结果存起来).以 ...
- xml-apis-ext.jar
xml-apis-ext.jar,hightcharts导出图片是解决乱码需要用到的一个包
- Web网站高并发量的解决方案
摘要: 一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很简单.随着互联网业务的不断丰富,网站相 ...
- sqoop 1.99.7 安装及配置
一 下载sqoop 1.99.7 http://mirror.bit.edu.cn/apache/sqoop/1.99.7/ 二 解压安装文件 三 配置Sqoop 环境变量 最后把mysql的驱动j ...
- Dropbox的CEO在MIT的毕业演讲
这是我今天看到的一个演讲,个人觉得和乔老大在斯坦佛的毕业演讲有异曲同工之妙,我也觉得对工科的我们很有启发意义,就此转载,希望与君共勉. 编者注:本篇文章基于Drew Houston 在 MIT 毕业典 ...
- 【转】优秀的Java程序员必须了解GC的工作原理
一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率 ,才能提高整个应 ...
- win8安装wampserver报403错误解决方法
看着别人开始体验win8了,前几天我也安装了win8系统,总体来说还不错,但是今天安装完Wampserver后,浏览器输入localhost,竟然报了403错误,我以为我安装出错了,后来研究了半天,发 ...
- labview
1.labview适用于测试测量领域,用于快速构建PC端上位机程序 2.例子: 我的电气参数测试仪. 上位机软件比想象的做的快了十几天... 学校的创新基金可以交差了,界面还是个人比较满意了.. 上图 ...