事情起因

如果不喜欢看故事的同学,请前往下一章节。

事情起因是我打算集成Redis缓存,配置了Redis以后,发现@Cacheable注解始终不生效,折腾了大半天以后,我的心态已经崩了,决定不使用@Cacheable注解了,自己来设置缓存和读取缓存,当然这篇文章的主题是Lambda表达式,所以缓存的问题一笔带过。在自己获取缓存和设置缓存的时候,发现大量重复的代码,都是一样的if判断语句,所以决定写一个通用的方法把重复的代码干掉,就想到了可以使用函数式编程,Lambda表达式可以精简代码,就分享给大家一下作为参考。

什么是Lambda表达式

Lambda表达式推动Java8发布的最重要新特性。Lambda表达式允许把函数作为一个方法的参数(函数作为参数传递进方法中)。所以你必须升级到 JDK8 以上才可以使用Lambda表达式,如果是 JDK7 的同学就无缘Lambda表达式了。

Lambda表达式的格式

(parameters) -> expression 或 (parameters) ->{ statements; }

圆括号中的参数可以不写类型,编译器可以统一识别参数值;大括号呢在只有一句的情况下可以省略掉大括号

开始使用Lambda表达式

第一步,需要先定义一个函数式接口,例如

?

1

2

3

4

@FunctionalInterface

public

interface

IFunctionObject {

Object function();

}

所谓的函数式接口,首先是接口,然后就是在这个接口里面只能有一个抽象方法。也称为SAM(Single Abstract Method interfaces)接口。注解@FunctionalInterface用于编译检查,如果不符合函数式接口在编译时就会报错,是一个错误检查的功能。

第二步,在具体业务逻辑中调用函数式接口,例如

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

/**

* 从缓存中获取对象,如果没有则运行对象获取接口放入缓存

*

* @param key            H

* @param hashKey        HK

* @param functionObject 对象获取接口

* @return 对象

*/

protected Object cacheGet(String key,

String hashKey,

IFunctionObject functionObject) {

Object object =

null

;

try

{

//从缓存中获取对象

object = redisTemplate.opsForHash()

.get(key, hashKey);

if

(object ==

null

) {

//没有获取到对象,运行对象获取接口放入缓存

object = functionObject.function();

if (object !=null &&

objectinstanceof Serializable)

cacheSetHash(key, hashKey, object);

}

}

catch

(Exception e) {

log.error(e.getMessage(), e);

}

return

object;

}

第三步,使用Lambda表达式调用我们的业务代码,例如:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

/**

* 根据ID获取文章

*

* @param id ID编号

* @return 文章

*/

public

Article getArticleById(Long id) {

//先从缓存中获取,如果没有就从数据库中获取

Article article = (Article)

cacheGet("article", id.toString(),

() -> articleMapper.selectByPrimaryKey(id));

//拿到以后,浏览量加一

if

(article !=

null

) {

setViewAdd(id);

}

return

article;

}

其他函数式接口使用举例:下面的方法都可以使用Lambda表达式调用

java.lang.Runnable,

java.awt.event.ActionListener,

java.util.Comparator,

java.util.concurrent.Callable

java.util.function包下的接口,如Consumer、Predicate、Supplier等

总结

说一下我的理解,Lambda表达式其实就是一个匿名函数,而这个函数可以当做一个参数在方法间传递,可以把函数式接口理解为一个Class类型,Lambda表达式就是这个类型的变量,只不过这个变量比较特殊,他可以运行一些逻辑以后返回结果

项目中使用 java函数式编程_函数式编程在Java8中使用Lambda表达式进行开发相关推荐

  1. JDK8_新特性_详细总结+代码(1)Lambda表达式

    Java 是第一大编程语言和开发平台.它有助于企业降低成本.缩短开发周期.推动创新以及改善应用服务.如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选 ...

  2. java 函数式编程_函数式编程杂谈

    比起命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断演进,逐层推导出复杂的运算.本文通过函数式编程的一些趣味用法来阐述学习函数式编程的奇妙之处. 一 ...

  3. 面向java开发者的函数式编程_函数式编程让你忘记设计模式

    本文是一篇<Java 8实战>的阅读笔记,阅读大约需要5分钟. 有点标题党,但是这确实是我最近使用Lambda表达式的感受.设计模式是过去的一些好的经验和套路的总结,但是好的语言特性可以让 ...

  4. 纯函数式编程语言_函数式编程正在接管具有纯视图的UI。

    纯函数式编程语言 by Bobby Schultz 由Bobby Schultz 函数式编程正在接管具有纯视图的 UI . (Functional Programming is taking over ...

  5. 响应式编程 函数式编程_函数式编程简介

    响应式编程 函数式编程 根据您要求的对象, 函数式编程 (FP)是一种应运而生的开明编程方法,或者是一种在实践中几乎没有实际好处的过于学术化的方法. 在本文中,我将解释什么是函数式编程,探讨其好处,并 ...

  6. java compare 返回值_关于Java你不知道的那些事之Java8新特性[Lambda表达式和函数式接口]...

    前言 为什么要用Lambda表达式? Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,将代码像数据一样传递,这样可以写出更简洁.更灵活的代码,作为一个更紧凑的代码风 ...

  7. java8新特性lambda表达式、函数式编程、方法引用和接口默认方法以及内部类访问外部变量

    一提到java是一种什么语言? 大多数人肯定异口同声的说是一门面向对象的语言,这种观点从我们开始学java就已经根深蒂固了,但是学到java8新特性函数式编程的时候,我才知道java并不是纯面向对象的 ...

  8. java 求导函数_面向对象编程 —— java实现函数求导

    文章目录 首先声明一点,本文主要介绍的是面向对象(OO)的思想,顺便谈下函数式编程,而不是教你如何准确地.科学地用java求出函数在一点的导数. ★引子 defd(f) :defcalc(x) : d ...

  9. java面向对象程序_面向对象编程基础(java)

    面向对象编程基础 1.1 面向对象概述 在程序开发初期,大家使用的是结构化开发语言,也就是面向过程(opp),但随着市场需求剧增,软件的规模也越来越大,结构化语言的弊端也暴露出来. 开发周期无休止的拖 ...

最新文章

  1. JGG | 肠道微生物研究助力穿山甲圈养保护
  2. 原生JS添加类名 删除类名
  3. doctype的三种类型
  4. 全志 增加启动默launcher函数 Patch
  5. 做好MSSQL保卫战之xp_cmdshell
  6. 八、华为鸿蒙HarmonyOS应用开发之Java UI框架、常用TextField组件使用
  7. java多线程代码_java多线程实例代码详解
  8. 机器学习8-集成学习
  9. 深入解读Linux内存管理系列(8)——SLAB初始化
  10. c语言 写高斯分布函数
  11. AD18学习速通教程
  12. Retrofit完美封装
  13. QT信号与槽机制与事件机制的区别
  14. VPS搭建zotero自动同步的webdav服务
  15. 空中飞猴 题解 暴力
  16. ad20栅格_AD软件的3种栅格设置详解
  17. 自动滑动背景图片html,html背景图片滚动属性bgproperties
  18. 自学电脑专业技术可以考证吗
  19. Java高级工程师面试之路
  20. 北斗导航卫星公开服务信号频率

热门文章

  1. 微信小程序获取openid
  2. 基于MUI框架的HTML5+的二维码扫描实现
  3. 2020年蓝桥杯比赛时间_我院举办2021年创新创业大赛启动仪式及第12届蓝桥杯动员大会...
  4. where嵌套select_Select子查询:Select Zoo
  5. 插入的数据不能时时查询到_数据库原理笔记
  6. time函数python_Python连载6-time包函数简介
  7. php sqlsrv 下载,php_sqlsrv_ts.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...
  8. Moving stones(暴力+思维)
  9. php图片显示框,【转】php让图片弹出下载框的方法
  10. python 建站需求_python建站基础环境配置