Java的Lambda表达式
Java的Lambda表达式
1. 什么是Lambda表达式
简单的说,Lambda表达式就是匿名方法。Lambda表达式让程序员能够使用更加简洁的代码,但是同样也使代码的可读性比较差。
Lambda表达式也叫做匿名方法或者闭包。
2. 和匿名内部类做对比
Lambda是匿名方法,这个时候我们会想想到匿名内部类,我们来回想一下匿名内部类的用法,比如下面的代码就是使用匿名内部类实现了一个线程。
public class Test {
public static void main(String[] args) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程:" + Thread.currentThread().getName());
}
});
t.start();
}
}
我们一般的做法是写一个Runnable接口的实现类,然后new一个实现类再传给Thread的构造器。如下:
public class Test {
public static void main(String[] args) {
MyThread myThread = new MyThread();
Thread t = new Thread(myThread);
t.start();
}
static class MyThread implements Runnable {
@Override
public void run() {
System.out.println("线程:" + Thread.currentThread().getName());
}
}
}
可以看到使用匿名内部类的话就省略了新建Runnable接口的实现类这一步骤。
3. 使用Lambda表达式
上面使用匿名内部类的写法,如果使用Lambda表达式可以写成下面这样:
public class Test {
public static void main(String[] args) {
Thread t = new Thread(() -> {
System.out.println("线程:" + Thread.currentThread().getName());
});
t.start();
}
}
这样有一个问题,如果接口里面有多个方法,那么Lambda表达式怎么知道实现的是哪个方法呢?我们通过代码测试一下:
package com.wangjun.othersOfJava;
public class LambdaTest {
public static void main(String[] args) {
Animal a = () -> { // 编译报错:The target type of this expression must be a functional interface
System.out.println("狗狗吃饭");
};
a.eat();
}
interface Animal {
public void eat();
public void duty();
}
}
可以看到编译报错,这个提到一个functional interface,就是函数式接口。函数式接口就是只有一个抽象方法的接口。这样,就不难理解了,原来Lambda表达式只支持函数式接口。
4. Lambda表达式使用的几种方式
package com.wangjun.othersOfJava;
public class LambdaTest {
public static void main(String[] args) {
// 带类型
Animal a1 = (String str) -> {
System.out.println("狗狗吃饭:" + str);
};
// 不带类型
Animal a2 = (str) -> {
System.out.println("狗狗吃饭:" + str);
};
// 不带括号
Animal a3 = str -> {
System.out.println("狗狗吃饭:" + str);
};
// 不带大括号
Animal a4 = str -> System.out.println("狗狗吃饭:" + str);
a1.eat("火腿肠");
a2.eat("牛肉");
a3.eat("面条");
a4.eat("米饭");
// 使用return返回
Person p1 = () -> {
return "老师的职责:教书育人!";
};
// 直接返回
Person p2 = () -> "医生的职责:救死扶伤!";
System.out.println(p1.duty());
System.out.println(p2.duty());
}
// 没有返回值
interface Animal {
public void eat(String str);
}
// 有返回值
interface Person {
public String duty();
}
}
4. Java的双冒号表达式
JDK8中有双冒号的用法,就是把方法当做参数传到stream内部,使stream的每个元素都传入到该方法里面执行一下。下面通过遍历一个List来说明一下双冒号和Lambda表达式使用方式的不同。
package com.wangjun.othersOfJava;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
public class LambdaTest {
public static void printStr(String str) {
System.out.println(str);
}
public static void main(String[] args) {
List<String> list = Arrays.asList("aaa","bbb","ccc");
// 1.通常的遍历方式
for(String str: list) {
LambdaTest.printStr(str);
}
// 2.使用Lambda表达式遍历
list.forEach(str -> {
LambdaTest.printStr(str);
});
// 3.使用::遍历
list.forEach(LambdaTest::printStr);
// 下面的方法和上面等价,使用的是函数式编程
Consumer<String> methodParam = LambdaTest::printStr; //方法参数
list.forEach(x -> methodParam.accept(x));//方法执行accept
}
}
Java的Lambda表达式的更多相关文章
- Java 8 Lambda表达式
Java 8 Lambda表达式探险 http://www.cnblogs.com/feichexia/archive/2012/11/15/Java8_LambdaExpression.html 为 ...
- 深入浅出 Java 8 Lambda 表达式
摘要:此篇文章主要介绍 Java8 Lambda 表达式产生的背景和用法,以及 Lambda 表达式与匿名类的不同等.本文系 OneAPM 工程师编译整理. Java 是一流的面向对象语言,除了部分简 ...
- Java 8 Lambda表达式10个示例【存】
PS:不能完全参考文章的代码,请参考这个文件http://files.cnblogs.com/files/AIThink/Test01.zip 在Java 8之前,如果想将行为传入函数,仅有的选择就是 ...
- Java 8 Lambda 表达式
Lambda 是啥玩意 简单来说,Lambda 就是一个匿名的方法,就这样,没啥特别的.它采用一种非常简洁的方式来定义方法.当你想传递可复用的方法片段时,匿名方法非常有用.例如,将一个方法传递给另外一 ...
- Java 8 lambda表达式示例
例1.用lambda表达式实现Runnable 我开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例.看一下Java 8之前的runna ...
- Java 8 Lambda 表达式详解
一.Java 8 Lambda 表达式了解 参考:Java 8 Lambda 表达式 | 菜鸟教程 1.1 介绍: Lambda 表达式,也可称为闭包,是推动 Java 8 发布的最重要新特性. La ...
- 用Java 8 Lambda表达式实现设计模式:命令模式
在这篇博客里,我将说明如何在使用 Java 8 Lambda表达式 的函数式编程方式 时实现 命令 设计模式 .命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化 ...
- Java基础学习总结(44)——10个Java 8 Lambda表达式经典示例
Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Ja ...
- 02、Java的lambda表达式和JavaScript的箭头函数
前言 在JDK8和ES6的语言发展中,在Java的lambda表达式和JavaScript的箭头函数这两者有着千丝万缕的联系:本次试图通过这篇文章弄懂上面的两个"语法糖". 简介 ...
- Java 8 Lambda表达式学习和理解
Java 8 Lambda表达式和理解 说明:部分资料来源于网络 时间:20190704 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性.Lambda 允许把函数作为一 ...
随机推荐
- HotSpot JVM目录
一.知识结构整理 jvm体系大体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 GC分析 命令调优 二.运行时JVM结构组成及作用 http://www.cnblogs.com/imxi ...
- leetcode-174. Dungeon Game 地下城游戏
一道关于骑士救公主故事的题目. 一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过 ...
- zabbix-自定义监控项
一.自定义一个监控项 模板虽好,但是不能解决所有的监控,有些需要的监控项在模板中并没有,需要我们自己定义一个监控项,如何定义一个监控项呢?大概的流程是这样的几步 .在插件配置文件中定义一个key/va ...
- Kubernetes的核心技术概念和API对象
Kubernetes的核心技术概念和API对象 API对象是K8s集群中的管理操作单元.K8s集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的API对象,支持对该功能的管理操作.例如副本集 ...
- 学JAVA有哪些好的技巧方法?干货分享
作为编程语言届的老大哥,学习JAVA的人数不胜数,在这里分享一些学习JAVA的技巧以及方法,当然,这些技巧及方法使用范围包含但不限于JAVA. ① 笔记软件 印象笔记:多端互通很方便(https:// ...
- Windows Media Player播放视频导致程序闪退
在有的电脑上发现,使用Windows Media Player组件播放视频导致程序闪退. 发现是显卡问题,独立显卡换成集成显卡 解决: 打开显卡控制面板->管理3D设置->集成图形-> ...
- 09—mybatis注解配置join查询
今天来聊mybatis的join查询,怎么说呢,有的时候,join查询确实能提升查询效率,今天举个left join的例子,来看看mybatis的join查询. 就不写的很细了,把主要代码贴出来了. ...
- spring timetask 定时任务调度
作者:Garry1115 定时任务调度即在设置的特定时间执行特定的任务,不需要人工干预. spring timertask spring 自身所带定时任务类,不需要引入第三方jar包,使用方式如下: ...
- Django 反向查找(related_name)
先定义两个模型,一个是A,一个是B,是一对多的类型 class A(models.Model): name= models.CharField('名称', max_length=32) class B ...
- ZooKeeper某一QuorumPeerMain挂了
问题在哪呢?好久没没有出现类似问题了 解决方案: 之前zookeeper 是可以正常启动的,今天启动zookeeper时报如上错误.经过测试发现: 只要在~/zookeeper/data/ 下删除文件 ...