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

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

目的

学习简化代码的思路,使用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. LOJ6671 EntropyIncreaser 与 Minecraft (生成函数)

    题面 EntropyIncreaser 是组合计数大师. EntropyIncreaser 很喜欢玩麦块.当然,EntropyIncreaser 拥有非同常人的超能力,他玩的是MOD版的 n 维麦块, ...

  2. 3-14 Python处理XML文件

    xml文件处理 什么是xml文件? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 从结构上,很像HTML超文本标记语言.但他们被设计的目的 ...

  3. 完全彻底的卸载MySQL5.7.35

    最开始接触计算机的时候关于MySQL卸载的这个问题,导致我重装了一次系统.就在今天我又遇到了同样的问题. Setp①: 想要安装新的数据库软件必须要先彻底且干净的删除掉以前的数据库. 第一步要做的是停 ...

  4. 经纬度转换为距离单位km的方法

    function rad(d){ return d * Math.PI /180.0; }; GetDistance(lat1, lng1, lat2, lng2){ var radLat1 =rad ...

  5. web前端小知识 —— 【HTML,CSS,JS】集锦 【第一期】 { }

    1.获取元素样式属性的方法 第 一 种 : 较灵活,能获取传进来想获取的元素的样式属性,返回的是[字符串] function getStyle(obj, name) { // IE // 主流 ret ...

  6. OpenDataV低代码平台新增组件流程

    OpenDataV计划采用子库的方式添加子组件,即每一个组件都当做一个子库,子库有自己的依赖,而项目本身的依赖只针对框架,因此每一个组件我们都当做一个子库来开发.下面我带着大家一步步详细的开发一个数字 ...

  7. .NET 7 SDK 开始 支持构建容器化应用程序

    微软于 8 月 25 日在.NET官方博客上,.NET 7 SDK 将包括对创建容器化应用程序的支持,作为构建发布过程的一部分,从而绕过需要.显式 Docker 构建阶段. 这一决定背后的基本认知是简 ...

  8. acme.sh官方中文说明文档

    转载自:https://github.com/acmesh-official/acme.sh/wiki/说明 acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书. ...

  9. MySql的InnoDB的三层B+树可以存储两千万左右条数据的计算逻辑

    总结/朱季谦 B+树是一种在非叶子节点存放排序好的索引而在叶子节点存放数据的数据结构,值得注意的是,在叶子节点中,存储的并非只是一行表数据,而是以页为单位存储,一个页可以包含多行表记录.非叶子节点存放 ...

  10. electron 基础

    electron 基础 前文我们快速的用了一下 electron.本篇将进一步介绍其基础知识点,例如:生命周期.主进程和渲染进程通信.contextBridge.预加载(禁用node集成).优雅的显示 ...