Lambda入门,看这一篇幅就够了
jdk1.8中的lambda表达式学习笔记
一、引入一个例子
我们写一个多线程的例子,如下:采用实现Runable接口的方式
package cn.lyn4ever.lambda;
public class TestMain1 {
public static void main(String[] args) {
//线程1
MyThread myThread1 = new MyThread();
Thread t1 = new Thread(myThread1);
t1.start();
//线程2
MyThread myThread2 = new MyThread();
Thread t2 = new Thread(myThread2);
t2.start();
}
}
/**
* 我们先写一个类来实现Runable接口,为了方便直接写进了这个类中
*/
class MyThread implements Runnable {
@Override
public void run() {
System.out.println("这是一个多线程:" + Thread.currentThread().getId());
}
}
当然,没有任命毛病。觉得自己写个类外部类太麻烦,那就写一个匿名内部类
package cn.lyn4ever.lambda;
public class TestMain2 {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("这是一个线程:"+Thread.currentThread().getId());
}
}).start();
}
}
这样还是不够简单,那就用lambda表达式好了.
new Thread(()->{
System.out.println("这是一个线程:"+Thread.currentThread().getId());
}).start();
是的,就这么一句。看一个结果

二、函数式接口
所谓函数式接口,就是这个接口只有一个抽象方法,(可以包含静态方法和default方法,这是jdk1.8以后的特性),
自定义一个函数式接口的方法很简单,就是加了注解,编译器会帮我们检查代码合理性
@FunctionalInterface
public interface MyFunction {
/**
* 定义一个获取字母大写的方法
* @return
*/
String getUpperCase(String letter);
}
然后简单地应用下我们这个接口
public static void main(String[] args) {
//匿名内部类
MyFunction myFunction = new MyFunction() {
@Override
public String getUpperCase(String letter) {
//实现这个方法
return letter.trim().toUpperCase();
}
};
//然后调用方法
System.out.println(myFunction.getUpperCase("this is MyFunctoinTest"));
//lambda表达式
MyFunction myFunction1 = (String letter)->{
return letter.trim().toUpperCase();
};
//然后调用方法
System.out.println(myFunction1.getUpperCase("this is MyFunctoinTest"));
}

可以看到,我们定义的这个MyFunction接口并没有什么用,因为具体的实现是在匿名内部类中写的。
java.lang.Runable
java.lang.Comparable
java.lang.Comparator
java.lang.FileFilter
...
在java.util.function包中还定义了大量的功能性函数式接口,我们可以直接使用,而不用自己再去创建接口了。比如以下
1.java.util.Predicate 接收一个对象T,返回一个boolean类型结果
//定义一个功能,如果输入0,这返回true,其他的返回false
Predicate<Integer> predicate = (Integer param) -> {
if (null != param && param == 0)
return true;
return false;
};
//直接调用predicate中的test方法
System.out.println(predicate.test(12));
可以看一个Predicate的源代码

代码的结果肯定是false,不用看了。这个接口就可以满足我们的需求,只要我们想要 接收一个对象T,返回一个boolean类型结果这样的功能,完全不用单独定义方法,只要用这个类就可以了。
还有很多,就不举例子了,将它们的功能列举出来
java.util.function.Comsumer<T> 传入对象T,只是运算,不返回结果 (大家都知道,类作为形参时是地址引入)
<R> java.util.function.Funtion<T> 传入对象T,返回对象R
<T> java.util.function.Supplier 不接收参数,提供T对象
<T> java.util.function.UnaryOperator<T> 接收参数对象T,返回结果对象T
<T> java.util.function.BinaryOperator<T,T> 接收两个T对象,返回一个T对象(下边有个例子)
public static void main(String[] args) {
BinaryOperator<Integer> binaryOperator = (Integer i, Integer j) -> {
//返回两个数中较大的一个
return i > j ? i : j;
};
System.out.println(binaryOperator.apply(12,13));//13
}
三、Lambda表达式的基本语法
1.基本语法
- 0.基本语法:
T r = new T { () -> {这里边是方法的具体实现} }; - 1.lambda表达式要和接口绑定,
- 2.如果表达式中方法的实现只有一条语句,可以不写{} 和 reutrn 关键字,否则必须要写(如果有返回值就要写reutrn,没有不用写)
- 3.如果接口中的方法有参数,在() 中参数的类型,可写可不写
看一个例子
package cn.lyn4ever.lambda.exmple;
public class ExampleDemo {
public static void main(String[] args) {
NoResultNoParam noResultNoParam = () -> System.out.println("NoResultNoParam");
noResultNoParam.test();
NoResultHasParam noResultHasParam = (param) -> System.out.println(param);
noResultHasParam.test("hello");
HasResultHasParam hasResultHasParam = (x, y) -> {
int z = x + y;
return z;
};
//下边这个也可以,只有一个返回值时,不用写{}
HasResultHasParam hasResultHasParam1 = (x, y) -> x + y;
System.out.println(hasResultHasParam.test(1,2));
System.out.println(hasResultHasParam1.test(10,20));
}
}
interface NoResultNoParam {
void test();
}
interface NoResultHasParam {
void test(String param);
}
interface HasResultHasParam {
int test(int x, int y);
}
Lambda入门,看这一篇幅就够了的更多相关文章
- Vue开发入门看这篇文章就够了
摘要: 很多值得了解的细节. 原文:Vue开发看这篇文章就够了 作者:Random Fundebug经授权转载,版权归原作者所有. 介绍 Vue 中文网 Vue github Vue.js 是一套构建 ...
- Mybatis入门看这一篇就够了
什么是MyBatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...
- Spring入门看这一篇就够了
前言 前面已经学习了Struts2和Hibernate框架了.接下来学习的是Spring框架...本博文主要是引入Spring框架... Spring介绍 Spring诞生: 创建Spring的目的就 ...
- Git入门看这一篇就够了! (转)
Git 的三种状态 Git 有三种状态,你的文件可能处于其中之一: 已提交(committed):数据已经安全的保存在本地数据库中. 已修改(modified):已修改表示修改了文件,但还没保存到数据 ...
- JSON入门看这一篇就够了
什么是JSON JSON:JavaScript Object Notation [JavaScript 对象表示法] JSON 是存储和交换文本信息的语法.类似 XML. JSON采用完全独立于任何程 ...
- Python + Appium 自动化操作微信入门看这一篇就够了
简介 Appium 是一个开源的自动化测试工具,支持 Android.iOS 平台上的原生应用,支持 Java.Python.PHP 等多种语言. Appium 封装了 Selenium,能够为用户提 ...
- RabbitMQ入门看这一篇就够了
一文搞懂 RabbitMQ 的重要概念以及安装 一 RabbitMQ 介绍 这部分参考了 <RabbitMQ实战指南>这本书的第 1 章和第 2 章. 1.1 RabbitMQ 简介 Ra ...
- Spring Cloud入门看这一篇就够了
目录 SpringCloud微服务 架构演进 服务调用方式: Euraka服务注册中心 注册中心 服务提供者(服务注册) 服务消费者(服务发现) 服务续约 失效剔除和自我保护 Consul 特性 Co ...
- MySQL入门看这一篇就够了
MySQL JavaEE:企业级Java开发 web阶段 分为1.前端(页面,展示数据库中的数据) 2.后台(连接点:链接数据库JDBC.Mybatis,链接前端(控制视图跳转,给前端传递数据)) 3 ...
随机推荐
- spring cloud 2.x版本 Eureka Client服务提供者教程
本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 1 创建eureka client 1.1 新建Srping boot工程:eureka-c ...
- 泛微OA系统多版本存在命令执行漏洞
0x01漏洞描述 泛微OA办公系统是一款协调办公软件. 泛微协同商务软件系统存在命令执行漏洞,攻击者可利用该漏洞获取服务器权限. 0x02漏洞危害 攻击者可以通过精心构造的请求包在受影响版本的泛微OA ...
- UVA12433 【Rent a Car】
这题应该算是比较难的一道网络流的题,(但却在我校OJ考试上出现了),但是大家只要能理解此图的建边方式就行. 假设有5天的租车需求,虚拟出2*n+2 即 12个节点,0为源点,12为汇点. 1,源点到1 ...
- mysql设计规范二
一.基本规范 必须使用InnoDB存储引擎 必须使用UTF8字符集 数据表.数据字段必须加入中文注释 二.设计规范 库名称.表名称.字段名称必须使用小写,最好不要使用驼峰式,使用“_”区分,例如use ...
- JS中获取元素属性的逆天大法
给大家聊下js中获取元素属性的逆天大法,胆小慎入,切记切记!!! innerHTML.outerHTML.innerText .outerText.value.text().html(),val() ...
- 原生JS实现单向链表
1.前言 用JS实现一个简单的单向链表,并完成相关的功能 2.功能说明 push(value):从链表尾部添加一个新的节点 insertAfer(value,item):向链表中的item节点之后插入 ...
- Microsoft Visual C++ 14.0 is required问题解决
当我们在windows下安装包或者软件时会出现: Microsoft Visual C++ b'v14.0 is required 错误解决办法 直接下载安装visualstudio: https:/ ...
- python 快速发送大量邮件
因为公司需求,需要发送千万封级别邮件. # coding:utf-8 import csv import smtplib from email.mime.text import MIMEText im ...
- CAS Server集成QQ登录、新浪微博登录源码及配置文件
转载自素文宅博客:https://blog.yoodb.com/yoodb/article/detail/1446 CAS Server集成QQ第三方登录,CAS Server集成新浪微博第三方登录以 ...
- 深入理解计算机系统 第二章 信息的表示和处理 Part1 第二遍
<深入理解计算机系统> 第三版 第二遍读这本书,每周花两到三小时时间,能读多少读多少(这次看了 22 ~ 28 页) 第一遍对应笔记链接 https://www.cnblogs.com/s ...