• Java8新特性:Function接口和Lambda表达式参考


    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(判断这个权限标识来决定该用户是否有权限访问该链接)

  • 相关阅读:
    马哥教育N63013第十周作业
    马哥教育N63013第八周作业
    马哥教育N63013第十二周作业
    终于开通博客园的博客了
    Teradata 查看表的列名
    基础一 数据结构
    ubuntu 快速安装ninja和gn
    linux格式化文件命令
    ESP8266_RTOS_SDK更新子模块出错git remote: [sessionf0448081] 404 not found!
    springboot 自动配置原理
  • 原文地址:https://www.cnblogs.com/free-wings/p/9671993.html
Copyright © 2020-2023  润新知