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. 其他新特 ...
随机推荐
- Cisco的互联网络操作系统IOS和安全设备管理器SDM__散知识点1
1.启动路由器:当你初次启动一台Cisco路由器时,它将运行开机自检(POST)过程.如果通过了,它将从闪存中查找Cisco IOS,如果有IOS文件存在,则执行装载操作(闪存是一个可电子擦写.可编程 ...
- PHP基础之与MySQL那些事
前言 这篇文章会对PHP的MySQL扩展库,MySQLI的扩展库,SQL批量执行,事务控制等等进行一些简单的讲解. MySQL扩展 PHP中MySQL扩展,虽然因为安全的原因,在PHP5.6及往上不在 ...
- 使用 with as 优化SQL
当我们书写一些结构相对复杂的SQL语句时,可能某个子查询在多个层级多个地方存在重复使用的情况,这个时候我们可以使用 with as 语句将其独立出来,极大提高SQL可读性,简化SQL~ with as ...
- hdu 6681 Rikka with Cake(扫描线)
题意:给你一个n*m的的矩形框 现在又k条射线 问这个矩形框会被分为多少个区域 思路:之前的想法是枚举边界然后线段树扫一遍计算一下矩形个数 复杂度果断不行 后面发现其实答案就是交点数+1 然后就用线段 ...
- Strategic game POJ - 1463 dfs
题意+题解: 1 //5 2 //1 1 3 //2 1 4 //3 1 5 //1 1 6 //给你5个点,从下面第二行到第五行(称为i行),每一行两个数x,y.表示i和x之间有一条边.这一条边的长 ...
- 再记一次 应用服务器 CPU 暴高事故分析
一:背景 1. 前言 大概有2个月没写博客了,不是不想写哈
- 整体算力提升40% 芯片级安全防护 | 阿里云发布第七代ECS云服务器
2 月 8 日,阿里云宣布推出第七代 ECS 云服务器产品家族,基于最新的神龙架构,相较于上一代整体算力提升 40%,容器部署密度最大可提升 6 倍,是最佳的云原生载体,此外全量搭载安全芯片,实现&q ...
- 微服务架构学习Day01-SpringBoot入门
基本概念 SpringBoot的优点: 可以创建独立的Spring应用 SpringBoot嵌入Tomcat,Jetty和Unsertow, 不需要部署war文件 根据需要通过maven获取start ...
- 关于TCP状态TIME_WAIT的理解
1.TIME_WAIT的作用: TIME_WAIT状态存在的理由:1)可靠地实现TCP全双工连接的终止 在进行关闭连接四次挥手协议时,最后的ACK是由主动关闭端发出的,如果这个最终的ACK丢失,服务器 ...
- 1054D Changing Array 【位运算+思维】
题目:戳这里 题意:两个数n,k,满足给的n个数小于2的k次方.每个数可以进行一次操作,即把a[i]换成a[i]^(1<<k-1);求最多的连续区间数使得 区间[L,R] (1<=L ...