Lambda基本:https://blog.csdn.net/wargon/article/details/80656575

https://www.cnblogs.com/hyyq/p/7425666.html

四大核心函数式编程接口:

https://blog.csdn.net/a879611951/article/details/80104014

https://blog.csdn.net/chuji2012/article/details/77871011

函数式编程教程(阮一峰):

http://www.ruanyifeng.com/blog/2017/02/fp-tutorial.html

Function接口结合Lambda表达式实现:

https://blog.csdn.net/huo065000/article/details/78964382

https://segmentfault.com/a/1190000012248864

Stream,方法引用和this:

https://www.cnblogs.com/aoeiuv/p/5911692.html

https://blog.csdn.net/blacksoil55/article/details/78359045

四大函数式编程接口的意义在于,普通类方法在定义以它们作为函数式的参数后,可以在类方法中直接调用它们的apply,consume等方法,传入参数,获取结果等,返回。在调用普通类方法时,传入lamda表达式作为这些函数式编程接口的实例,就是实现了apply,consume,test这些(唯一)抽象方法。这些方法有的接收入参返回出参,有的不返回,有的无入参,有的返回boolean等。注意应用lamda表达式的特性,如果是一句话表达式,表达式结果即函数式接口的抽象方法返回值;多行需要加{}且每句加分号。

如果不用这些函数式接口,我们就需要自己先定义一个函数式编程接口(详见lamda表达式入门),再定义普通类方法以我们自定义的函数式接口为参数,在类方法中调用函数式接口方法。然后在类方法调用时传入lamda表达式。

例子:

authorityList.stream().filter(authority ->
!StrUtil.equals(authority.getAuthority(), "ROLE_USER"))
.forEach(authority -> {
Set<MenuVO> menuVOSet = menuService.findMenuByRole(authority.getAuthority());
CollUtil.addAll(urls, menuVOSet);
});

其中filter的参数是Predicate函数式接口:

Stream<T> filter(Predicate<? super T> predicate);

filter这个普通类方法的一个实现为:

@Override
public final Stream<P_OUT> filter(Predicate<? super P_OUT> predicate) {
Objects.requireNonNull(predicate);
return new StatelessOp<P_OUT, P_OUT>(this, StreamShape.REFERENCE,
StreamOpFlag.NOT_SIZED) {
@Override
Sink<P_OUT> opWrapSink(int flags, Sink<P_OUT> sink) {
return new Sink.ChainedReference<P_OUT, P_OUT>(sink) {
@Override
public void begin(long size) {
downstream.begin(-1);
} @Override
public void accept(P_OUT u) {
if (predicate.test(u))
downstream.accept(u);
}
};
}
};
}

里面就调用了Predicate函数式接口的test方法。

对filter这个普通类方法的实际调用为:

authorityList.stream().filter(authority ->
!StrUtil.equals(authority.getAuthority(), "ROLE_USER"))

也就是传入了lamda表达式,作为Predicate接口的实现,其中的

 !StrUtil.equals(authority.getAuthority(), "ROLE_USER")

就是Predicate接口的test方法的实现,接收了authority 作为参数,省略了return,返回的就是表达式执行结果,一个boolean类型值。

关于Stream,Optional接口的例子:

urls.stream().filter(menu -> StrUtil.isNotEmpty(menu.getUrl())
&& antPathMatcher.match(menu.getUrl(), request.getRequestURI())
&& request.getMethod().equalsIgnoreCase(menu.getMethod()))
.findFirst().ifPresent(menuVO -> hasPermission.set(true));

这里stream和filter方法(filter方法语义原理见上文分析)均返回Stream,代表Collection容器的元素流对象,findFirst返回Optional,代表包装的可能存在的流元素,其中的value代表Collection中的实际元素值。

ifPresent方法定义为:

public void ifPresent(Consumer<? super T> consumer) {
if (value != null)
consumer.accept(value);
}

可见这里的语义是判断Collection中第一个元素是否非空,非空则执行Consumer接口的lamda表达式,将一个权限标识设置为true(判断这个权限标识来决定该用户是否有权限访问该链接)

Java8新特性:Function接口和Lambda表达式参考的更多相关文章

  1. Java8新特性(一)——Lambda表达式与函数式接口

    一.Java8新特性概述 1.Lambda 表达式 2. 函数式接口 3. 方法引用与构造器引用 4. Stream API 5. 接口中的默认方法与静态方法 6. 新时间日期 API 7. 其他新特 ...

  2. Java8新特性第1章(Lambda表达式)

    在介绍Lambda表达式之前,我们先来看只有单个方法的Interface(通常我们称之为回调接口): public interface OnClickListener { void onClick(V ...

  3. Java8新特性学习笔记(一) Lambda表达式

    没有用Lambda表达式的写法: Comparator<Transaction> byYear = new Comparator<Transaction>() { @Overr ...

  4. Java8新特性 利用流和Lambda表达式对List集合进行处理

    Lambda表达式处理List 最近在做项目的过程中经常会接触到 lambda 表达式,随后发现它基本上可以替代所有 for 循环,包括增强for循环.也就是我认为,绝大部分的for循环都可以用 la ...

  5. Java8 新特性----函数式接口,以及和Lambda表达式的关系

    这里来讲解一下Java8 新特性中的函数式接口, 以及和Lambda 表达式的关系.看到过很多不少介绍Java8特性的文章,都会介绍到函数式接口和lambda表达式,但是都是分别介绍,没有将两者的关系 ...

  6. Java基础之java8新特性(1)Lambda

    一.接口的默认方法.static方法.default方法. 1.接口的默认方法 在Java8之前,Java中接口里面的默认方法都是public abstract 修饰的抽象方法,抽象方法并没有方法实体 ...

  7. java8新特性(二)_lambda表达式

    最近一直找java8相关新特性的文章,发现都太没有一个连贯性,毕竟大家写博客肯定都有自己的侧重点,这里找到一本书,专门介绍java8新特性的,感觉大家可以看看<写给大忙人看的JavaSE8> ...

  8. 【Java8新特性】接口中的默认方法和静态方法,你都掌握了吗?

    写在前面 在Java8之前的版本中,接口中只能声明常量和抽象方法,接口的实现类中必须实现接口中所有的抽象方法.而在Java8中,接口中可以声明默认方法和静态方法,本文,我们就一起探讨下接口中的默认方法 ...

  9. 【Java8新特性】- 接口中默认方法修饰为普通方法

    Java8新特性 - 接口中默认方法修饰为普通方法 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学 ...

随机推荐

  1. Python开发【数据结构】:字典内部剖析

    字典内部剖析 开篇先提出几个疑问: 所有的类型都可以做字典的键值吗? 字典的存储结构是如何实现的? 散列冲突时如何解决? 最近看了一些关于字典的文章,决定通过自己的理解把他们写下来:本章将详细阐述上面 ...

  2. java获取系统当前服务器IP地址

    public String getServiceIp(){ InetAddress address; String myIp; try { address = InetAddress.getLocal ...

  3. Spark Streaming性能优化: 如何在生产环境下应对流数据峰值巨变

    1.为什么引入Backpressure 默认情况下,Spark Streaming通过Receiver以生产者生产数据的速率接收数据,计算过程中会出现batch processing time > ...

  4. javascript按字节截取标题中字符串

    在网页展示中经常会碰到,标题过长,需要截取字符串,用CSS的实现的话各种兼容问题,下面为大家介绍下javascript如何按字节截取字符串 做为一个前端开发人员在网页展示中经常会碰到,标题过长,需要截 ...

  5. [lr & ps] 色彩空间管理

    色彩空间 • 定义 色彩空间,Color Space,又称作色域.在色彩学中,人们建立了许多色彩模型,以一维.二维.三维甚至四维空间坐标来表示某一色彩,这种坐标系统所能定义的色彩范围即色彩空间.我们经 ...

  6. javascript脚本实现浏览器自动点击(阿里员工秒杀月饼)

    原文地址https://blog.csdn.net/ani521smile/article/details/52575063 秒杀活动页面 <!DOCTYPE HTML> <html ...

  7. C语言常用函数大全

    一.数学函数 调用数学函数时,要求在源文件中包下以下命令行: #include <math.h> 函数原型说明 功能 返回值 说明 int abs( int x) 求整数x的绝对值 计算结 ...

  8. mysql中char和varchar详解

    一.首先创建表. CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL, `a` char(255) DEFAULT NULL) ENGINE=InnoDB DE ...

  9. 岭回归(Ridge Regression)

    一.一般线性回归遇到的问题 在处理复杂的数据的回归问题时,普通的线性回归会遇到一些问题,主要表现在: 预测精度:这里要处理好这样一对为题,即样本的数量和特征的数量 时,最小二乘回归会有较小的方差 时, ...

  10. VS2012快捷键突然不能用怎么办

    晚上做项目做着做着,就去弄了下键盘配置,可怜的娃娃~~~一下子弄得什么快捷键都不能用了,比如”注释:ctrl+k ctrl+c”;问题纠结了我一个多钟,好在最后结合了网络上各路英雄的idea;解决了问 ...