代码,自然写的越简洁越好啦,写的人舒服,看的人也舒服,一切为了高效。

要把有限的时间花到其它有意思的事情上去。

目的

学习简化代码的思路,使用jdk8新特性lamada表达式。

使用

某接口,只有一个方法。

比如这个:

package java.lang;

@FunctionalInterface
public interface Runnable {
void run();
}

或者是这个:

interface MyInterface{
void sayHi();
}

实现接口,使用方法

一般我们要使用Runable子类开启一个线程,要实现Runnable接口,调用Threead类的start方法:

public class LeaningLamda implements Runnable{
public static void main(String[] args) {
new Thread(new LeaningLamda()).start();
}
@Override
public void run() {
System.out.println(this.getClass()+"我已经在跑了!");
}
}

或者用sayHi方法干点什么,要先实现接口,再调用:

public class LeaningLamda2 implements MyInterface{
public static void main(String[] args) {
new LeaningLamda2().sayHi();
} @Override
public void sayHi() {
System.out.println("ok ok ok ok ,i am say Hi!");
}
}
interface MyInterface{
void sayHi();
}

内部类实现接口,使用方法

如果这个方法我就用一次,那我可以在内部类中实现它,提高程序性能:

public class LeaningLamda{
static class MyRun implements Runnable{
@Override
public void run() {
System.out.println(this.getClass()+"我已经在跑了!");
}
}

public static void main(String[] args) {
new Thread(new MyRun()).start();
}
}

一样的用sayHi方法:

public class LeaningLamda2 {
static class MyHi implements MyInterface{
@Override
public void sayHi() {
System.out.println("ok ok ok ok ,i am say Hi!");
}
} public static void main(String[] args) {
new MyHi().sayHi();
}
}
interface MyInterface{
void sayHi();
}

局部内部类实现接口,使用方法

既然只使用一次,那我为啥不把它放在使用的方法里面去,性能不就又UpUpUpUp。

像这样:

public class LeaningLamda{
public static void main(String[] args) {

class MyRun implements Runnable{
@Override
public void run() {
System.out.println(this.getClass()+"我已经在跑了!");
}
}
//调用在定义后面,谢谢。
new Thread(new MyRun()).start();
}
}

或是这样:

public class LeaningLamda2 {
public static void main(String[] args) { class MyHi implements MyInterface{
@Override
public void sayHi() {
System.out.println("ok ok ok ok ,i am say Hi!");
}
}
new MyHi().sayHi();
}
}
interface MyInterface{
void sayHi();
}

匿名内部类实现接口,使用方法

我就用一次,要什么名字啊?能少输入一个字符都是赚的。需要借助父类或者接口名来实现。

你看:

public class LeaningLamda{
public static void main(String[] args) { //需要借助父类或者接口来声明
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(this.getClass()+"我已经在跑了!");
}
}).start();
}
}

又如:

public class LeaningLamda2 {
public static void main(String[] args) { new MyInterface(){
@Override
public void sayHi() {
System.out.println("ok ok ok ok ,i am say Hi!");
}
}.sayHi();
}
}
interface MyInterface{
void sayHi();
}

使用lamda表达式的,实现方法

jdk 8 看不下去了,给我们提供了一个更加简化的方案,你看:

lamda表达式实现创建单个简单线程:

public class LeaningLamda{
public static void main(String[] args) { new Thread(()-> {
System.out.println("我已经在跑了!");
}
).start();
}
}

lamda表达式sayHi:

public class LeaningLamda2 {
public static void main(String[] args) { //此处需要借助一个父类或接口对象来存放,调用它
MyInterface ls = ()->{
System.out.println("ok ok ok ok ,i am say Hi!"); };
ls.sayHi();
}
}
interface MyInterface{
void sayHi();
}

可带参数

lamda表达式可以带参数,可以不指定类型,它会自适应类型:

public class LeaningLamda2 {
public static void main(String[] args) { MyInterface ls = (i,str)->{
System.out.println("int:"+i);
System.out.println("String:"+str);}; ls.sayHi(520,"i love you!");
}
}
interface MyInterface{
void sayHi(int i,String str);
}

运行结果:

一个参数

那我括号都可以省了!

public class LeaningLamda2 {
public static void main(String[] args) { MyInterface ls = str-> System.out.println("String:"+str);
ls.sayHi("i love you!");
}
}
interface MyInterface{
void sayHi(String str);
}

运行结果:

返回值

如果有返回值呢,正常返回:

public class LeaningLamda2 {
public static void main(String[] args) { MyInterface ls = (String str)-> {
String str2 = "最后的赢家是:"+str;
return str2;};
System.out.println(ls.sayHi("lurenjia"));
}
}
interface MyInterface{
String sayHi(String str);
}

一条语句

如果方法只有一条语句,那大括号也没有必要,可以省略:

public class LeaningLamda2 {
public static void main(String[] args) { MyInterface ls = (int i,String str)-> System.out.println("int:"+i+"----String:"+str);
ls.sayHi(520,"i love you!");
}
}
interface MyInterface{
void sayHi(int i,String str);
}

究极省略,不能再省了

就一条语句,是返回值:

public class LeaningLamda2 {
public static void main(String[] args) { MyInterface ls = str-> "最后的赢家是:"+str;
System.out.println(ls.sayHi("中国"));
}
}
interface MyInterface{
String sayHi(String str);
}

运行结果:

lamda总结

常用于创建简单线程。

1、接口只有一个方法,可有参数,可有返回值。

2、本方法内容简单,使用较少。

3、基本形式为:

接口或父类   名称  = (参数类型1 参数1,参数类型2 参数2,...)->{
内容
};
名称.方法(参数1,参数2,...);

4、可以省略的是:

1、lamada参数类型可省,它自适应。

2、方法内容只有一条内容,大括号可省。

3、内容只有一句返回语句,return可省,直接写值。

Java使用lamda表达式简化代码的更多相关文章

  1. Java的lamda表达式/函数式接口/流式计算

    在我们看他人code的时候经常会看到,可能会经常看到lambda表达式,函数式接口,以及流式计算.在刚接触这些新功能时,也觉得真的有必要吗?但是现在写多了,发现这个功能确实能简化代码结构,提升编码效率 ...

  2. java中lamda表达式的应用

    lamda表达式主要是为了解决匿名内部类的繁琐过程 范例:简单的lamda表达式 此处使用匿名内部类 package com.java.demo; interface IMessage{ public ...

  3. java的lamda表达式

    Java8才支持lamda表达式  lamda是一中函数式编程语言 通过实现模式是匿名内部类 java使用内部类实现接口 首先定义一个接口 @FunctionalInterfaceinterface ...

  4. Java:用Lambda表达式简化代码一例

    之前,调用第3方服务,每个方法都差不多“长”这样, 写起来啰嗦, 改起来麻烦, 还容易改漏. public void authorizeRoleToUser(Long userId, List< ...

  5. java中lamda表达式用法

    map-> list Map<String, Object> map = new HashMap<>(); List<String> list = new A ...

  6. 为了去重复,写了一个通用的比较容器类,可以用在需要比较的地方,且支持Lamda表达式

    为了去重复,写了一个通用的比较容器类,可以用在需要比较的地方,且支持Lamda表达式,代码如下: public class DataComparer<T>:IEqualityCompare ...

  7. 让操作javascript对象数组像.net lamda表达式一样

    让操作javascript对象数组像.net lamda表达式一样 随着web应用程序的富客户端化.ajax的广泛使用及复杂的前端业务逻辑.对js对象数组.json数组的各种操作越来越多.越来越复杂. ...

  8. Java --Lamda表达式

    Lamda:属于函数式编程的概念: interface IMessage { public void print() ; } public class TestDemo { public static ...

  9. [19/04/06-星期六] 多线程_静态代理(StaticProxy)和 lamda (简化代码,jdk8新增)

    一.静态代理 [代码示例] /*** * 静态代理:记录日志等,类是写好的,直接拿来用. 动态代理:随用随构建,临时抱佛脚 * 婚庆公司:代理角色,帮你搞婚庆的一切,布置房间等等 * 自己:真实角色, ...

随机推荐

  1. JZM 的印象笔记 (卷积,分块)

    题面 题目背景 大名鼎鼎的 OI 天花板选手 JZM 对自己的好伙伴--印象笔记有些生疏了 题目描述 作为一名 OI 选手,他的笔记中的字母只包含数字0和1. JZM 在印象笔记中找到了一行 N N ...

  2. 尝试理解Linux容器进程与宿主机共享内核到底是什么意思?

    背景 近期接触容器技术时,经常看到各类比较容器与虚拟机区别的文章中会提到:容器是共享宿主机的内核,而虚拟机则是拥有自己独立的内核,所以不可能在Linux上用容器运行windows,但是用虚拟机则可以. ...

  3. 01 - 快速体验 Spring Security 5.7.2 | 权限管理基础

    在前面SpringBoot 2.7.2 的系列文章中,已经创建了几个 computer 相关的接口,这些接口直接通过 Spring Doc 或 POSTMAN 就可以访问.例如: GET http:/ ...

  4. alter role 导致的数据库无法登录问题

    ALTER ROLE  用于更改一个数据库角色.只要改角色后续开始一个新会话,指定的值将会成为该会话的默认值,并且会覆盖 kingbase.conf中存在的值或者从命令行收到的值. 显性的更改角色的一 ...

  5. 002-ImageNetClassificationDeep2017

    ImageNet classification with deep convolutional neural networks #paper 1. paper-info 1.1 Metadata Au ...

  6. 微服务系列之授权认证(二) identity server 4

    1.简介 IdentityServer4 是为ASP.NET Core系列量身打造的一款基于 OpenID Connect 和 OAuth 2.0 认证授权框架. 官方文档:https://ident ...

  7. Django 创建 APP和目录结构介绍

    一.通过pip安装Django 以windows 系统中使用pip命令安装为例 win+r,调出cmd,运行命令:pip install django自动安装PyPi 提供的最新版本.指定版本,可使用 ...

  8. Elasticsearch 快照生命周期管理 (SLM) 实战指南

    文章转载自:https://mp.weixin.qq.com/s/PSfgPJc4dKN2pOZd0Y02wA 1.Elasticsearch 保证高可用性的方式 Elasticsearch 保证集群 ...

  9. Kibana管理

    这里是用来管理您的 kibana 运行时配置的地方,包括初始化配置和后续的索引模式配置.高级设置等.您可以调整 kibana 自身的行为,也可以编辑您通过 kibana 保存的查询.视图.仪表板等各种 ...

  10. MySQL之pt-query-digest分析慢查询日志的详情介绍

    一.简介 pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdu ...