Lambad表达式--Java8新特性
1.概述
Lambda是一个匿名函数,是java8的一个新特性。可以对接口进行非常简洁的实现。但它要求接口中只能有一个抽象方法,原因是lambda只能实现一个方法。另外,需要在接口上添加注解@FunctionalInterface,添加此注解,也是说明此接口可以通过labmda进行实现,也就限制了此接口只能有一个抽象方法,如果有多个就会报错。
2.基础语法
2.1无参无返回值
接口:
@FunctionalInterface
public interface MyLambda {
void test();
}
调用:
public static void main(String[] args) {
//创建对象
MyLambda lambda = () -> {
System.out.println("我是无参无返回值的方法");
};
//调用方法
lambda.test();
}
2.2无参有返回值
接口:
@FunctionalInterface
public interface MyLambda {
int test();
}
调用:
public static void main(String[] args) {
//创建对象
MyLambda lambda = () -> {
System.out.println("我是无参有返回值的方法");
return 1;
};
//调用方法
System.out.println(lambda.test());
}
2.3单参无返回值
接口:
@FunctionalInterface
public interface MyLambda {
void test(int a);
}
调用:
public static void main(String[] args) {
//创建对象
MyLambda lambda = (int a) -> {
System.out.println("我是单参无返回值的方法,参数是:"+a);
};
//调用方法
lambda.test(10);
}
2.4多参无返回值
接口:
@FunctionalInterface
public interface MyLambda {
void test(int a,int b,int c);
}
调用:
public static void main(String[] args) {
//创建对象
MyLambda lambda = (int a,int b,int c) -> {
System.out.println("我是多参无返回值的方法,参数是:"+a+","+b+","+c);
};
//调用方法
lambda.test(10,20,15);
}
2.5单参有返回值
接口:
@FunctionalInterface
public interface MyLambda {
int test(int a);
}
调用:
public static void main(String[] args) {
//创建对象
MyLambda lambda = (int a) -> {
System.out.println("我是单参有返回值的方法,参数是:"+a);
return a*3;
};
//调用方法
System.out.println(lambda.test(10));
}
2.6多参有返回值
接口:
@FunctionalInterface
public interface MyLambda {
int test(int a,int b,int c);
}
调用:
public static void main(String[] args) {
//创建对象
MyLambda lambda = (int a,int b,int c) -> {
System.out.println("我是多参有返回值的方法,参数是:"+a+","+b+","+c);
return a+b+c;
};
//调用方法
System.out.println(lambda.test(10, 20, 15));
}
2.7语法简化
1)参数类型。由于在接口的抽象方法中已经定义了参数的类型,那么在lambda中就可以省略参数。需要注意的是,如果要省略参数类型,就必须省略全部的参数类型。
2)参数小括号。如果参数只有一个时,可以省略小括号。
3)参数大括号。如果方法体中只有一条语句,可以省略大括号。如果需要返回值,则要同时省略return关键字。
实例1:参数类型省略
public static void main(String[] args) {
//创建对象
MyLambda lambda = (a) -> {
return a*3;
};
//调用方法
System.out.println(lambda.test(10));
}
实例2:参数小括号省略
public static void main(String[] args) {
//创建对象
MyLambda lambda = a -> {
return a*3;
};
//调用方法
System.out.println(lambda.test(10));
}
实例3:参数大括号省略
public static void main(String[] args) {
//创建对象
MyLambda lambda = a -> a * 3;
//调用方法
System.out.println(lambda.test(10));
}
2.8方法的引用
它的作用是把一个lambda表达式实现指向一个已经实现的方法。
语法:方法的隶属者::方法名
先看下面的一个实例:接口参考2.6。
public static void main(String[] args) {
//创建对象
MyLambda lambda = (a,b,c) -> a+b+c;
//创建对象
MyLambda lambda2 = (a,b,c) -> a+b+c;
//调用方法
System.out.println(lambda.test(10,30,20));
}
如果在一个方法中对接口进行多次的实现,方法体的内容是一样的,写的也是比较麻烦的,那么此时就可以把方法体的内容写到一个新的方法中,然后去调用方法即可,再次调用时使用方法的引用就好。
public class LambdaTest {
public static void main(String[] args) {
//创建对象
MyLambda lambda = (a,b,c) -> add(a,b,c);
//方法的引用,类名::方法名
MyLambda lambda2 = LambdaTest::add;
//调用方法
System.out.println(lambda.test(10,30,20));
System.out.println(lambda2.test(10,30,20));
}
private static int add(int a,int b,int c){
return a+b+c;
}
}
3.核心函数式接口
3.1说明
在java中有四大内置的函数式接口,为接口的实现提供了方便,见下表:
| 接口名 | 方法 | 参数 | 返回值 | 说明 |
|
Predicate
|
boolean test(T t);
|
T | boolean | 断言型接口 |
|
Consumer
|
void accept(T t);
|
T | 无 | 消费型接口 |
|
Function
|
R apply(T t)
|
T、R | R | 函数型接口 |
|
Supplier
|
T get();
|
无 | T | 供给型接口 |
这些接口的使用下面详细介绍。
3.2Predicate
//将满足条件的字符串,放到集合中
public List<String> filterStr(List<String> list, Predicate<String> pre){
List<String> newList=new ArrayList<>();
for (String str:list) {
if(pre.test(str)){
newList.add(str);
}
}
return newList;
} @Test
public void test(){
List<String> list= Arrays.asList("idea","eclipse","predicate","function");
List<String> returnList= filterStr(list,(str)->str.length()>4);
for (String str:returnList) {
System.out.println(str);
}
}
3.3Consumer
//对接口进行实现
public void shopping(double money, Consumer<Double> con) {
con.accept(money);
} @Test
public void test() {
shopping(1000, x -> System.out.println("今天购物花了" + x + "元"));
}
3.4Function
//处理字符串
public String handlerStr(String str, Function<String,String> fun){
return fun.apply(str);
} @Test
public void test(){
String newStr= handlerStr("hello world,lambda",(str)->str.substring(3,6));
System.out.println(newStr);
}
3.5Supplier
//产生指定个数的整数,放到集合中并返回
public List<Integer> getNumList(int num, Supplier<Integer> sup) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < num; i++) {
Integer n = sup.get();
list.add(n);
}
return list;
} @Test
public void test() {
List<Integer> numList = getNumList(3, () -> (int) (Math.random() * 10));
for (Integer n : numList) {
System.out.println(n);
}
}
4.lambda综合应用
4.1forEach遍历集合
Map<String, Integer> map = new HashMap<>();
map.put("zhangs", 20);
map.put("lisi", 10);
map.put("wangwu", 40);
map.put("liliu", 30);
map.forEach((key, value) -> System.out.println(key + "," + value));
集合可以使用forEach方法遍历,这里主要介绍遍历map。
4.2集合list排序
List<Integer> list = Arrays.asList(10, 50, 30, 20, 15, 80, 90);
list.sort((o1, o2) -> o1 - o2);
System.out.println(list);
4.3集合treeSet排序
TreeSet<Integer> set = new TreeSet<>((o1, o2) -> {
if (o1 <= o2) {
return -1;
} else {
return 1;
}
});
set.add(10);
set.add(15);
set.add(20);
set.add(10);
set.add(50);
set.add(30);
set.add(9);
System.out.println(set);
4.4removeIf()
删除集合中符合条件的方法
List<Integer> list = new ArrayList<>();
list.add(10);
list.add(50);
list.add(30);
list.add(20);
list.add(15);
list.add(80);
list.add(90);
//删除小于50的元素
list.removeIf(o -> o < 50);
System.out.println(list);
4.5开启线程
Thread thread=new Thread(()->{
for (int i = 0; i < 20; i++) {
System.out.println(i);
}
});
thread.start();
Lambad表达式--Java8新特性的更多相关文章
- Java8新特性-Lambda表达式是什么?
目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...
- java8新特性(二)_lambda表达式
最近一直找java8相关新特性的文章,发现都太没有一个连贯性,毕竟大家写博客肯定都有自己的侧重点,这里找到一本书,专门介绍java8新特性的,感觉大家可以看看<写给大忙人看的JavaSE8> ...
- java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合
java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...
- 乐字节-Java8新特性-Lambda表达式
上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...
- Java8新特性之Lambda表达式
lambda表达式是java8给我们带来的几个重量级新特性之一,借用lambda表达式,可以让我们的java程序设计更加简洁.最近新的项目摒弃了1.6的版本,全面基于java8进行开发,本文是java ...
- JAVA8新特性——Lamda表达式
JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ Lamda表达式,读作λ表达式,它实质属于函数式编程的概念,要理解函数式编程的产生目的,就要先理解匿名内部类. 先来看看传统的匿名 ...
- java8新特性——Lambda表达式
上文中简单介绍了一下java8得一些新特性,与优点,也是为本次学习java8新特性制定一个学习的方向,后面几篇会根据上文中得新特性一一展开学习.本文就从java8新特性中比较重要的Lambda表达式开 ...
- Java8 新特性之Lambda表达式
1. Lambda 表达式概述 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递); Lambda 表达式可以写出更简洁,更灵活的代码 ...
- Java8新特性(一)——Lambda表达式与函数式接口
一.Java8新特性概述 1.Lambda 表达式 2. 函数式接口 3. 方法引用与构造器引用 4. Stream API 5. 接口中的默认方法与静态方法 6. 新时间日期 API 7. 其他新特 ...
随机推荐
- HTTPS优化与证书
1.HTTPS性能优化 1.1 HTTPS性能损耗原因 前文讨论了HTTPS原理与优势:身份验证.信息加密与完整性校验等,且未对TCP和HTTP协议做任何修改.但通过增加新协议以实现更安全的通信必然需 ...
- Workflow任务流发布不了
依赖的工作流要发布
- LightOJ - 1151 Snakes and Ladders(概率dp+高斯消元)
有100个格子,从1开始走,每次抛骰子走1~6,若抛出的点数导致走出了100以外,则重新抛一次.有n个格子会单向传送到其他格子,G[i]表示从i传送到G[i].1和100不会有传送,一个格子也不会有两 ...
- Codeforces Round #579 (Div. 3) E. Boxers (贪心)
题意:给你一组数,每个数都可以进行一次加一减一,问最后最多能有多少不同的数. 题解:我们可以用桶存每个数的次数,然后枚举\([1,150001]\)来求对答案的贡献,然后贪心,这里我们不用担心其他乱七 ...
- 恢复win10 LTSC 2019 图片查看器功能
1.开始–运行–输入"regedit"打开注册表. 2. 在打开的注册表编辑器中,从左侧依次展开:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Win ...
- 文件的读写(cpp)
文件的读写(cpp) c++中要进行文件的读入,首先要包含一个头文件 fstream . 输出到文件 为打开一个可供输出的文件需要定义一个ofstream 对象并将文件名传入: std::ofstre ...
- 国产网络损伤仪 SandStorm -- 什么是链路规则?
"链路规则"是网络损伤仪SandStorm(又名弱网测试仪)里面非常重要的功能,主要用于不同仿真链路之间的选择. 如下图的所示: ...
- 牛客网多校第5场 H subseq 【树状数组+离散化】
题目:戳这里 学习博客:戳这里 题意:给n个数为a1~an,找到字典序第k小的序列,输出该序列所有数所在位置. 解题思路:先把所有序列预处理出来,方法是设一个数组为dp,dp[i]表示以i为开头的序列 ...
- Leetcode(106)-从中序与后序遍历序列构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7 ...
- CNN可视化技术总结(三)--类可视化
CNN可视化技术总结(一)-特征图可视化 CNN可视化技术总结(二)--卷积核可视化 导言: 前面我们介绍了两种可视化方法,特征图可视化和卷积核可视化,这两种方法在论文中都比较常见,这两种更多的是用于 ...