java8函数式接口,以及stream流中map、peek、foreach区别

news2024/9/9 4:43:07

java8常用函数式接口

import java.util.function.Supplier;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
  • Supplier
@FunctionalInterface
public interface Supplier<T> {
    
     T get(); // 无参,有返
}
  • Consumer
@FunctionalInterface
public interface Consumer<T> {
    
    void accept(T t);   // 有参,无返
    // 默认方法
}
  • Function
@FunctionalInterface
public interface Function<T, R> {

    R apply(T t);  // 有参,有返
     // 默认方法、static方法
}
  • BiConsumer
@FunctionalInterface
public interface BiConsumer<T, U> {

    void accept(T t, U u);
    // 默认方法
}
  • BiFunction
@FunctionalInterface
public interface BiFunction<T, U, R> {

    R apply(T t, U u);
    // 默认方法
}
  • Predicate
@FunctionalInterface
public interface Predicate<T> {

    boolean test(T t);
     // 默认方法
}

// Bi开头的,BiConsumer和 BiFunction,都至少接受两个参数。而Consumer和 Function都是一个参数。

java8常用stream API

  • filter

stream().filter(Predicate p); 要求传入 Predicate,有参数,且返回布尔值,并生成原类型的stream流。

  • map

stream().map(Function mapper); 要求传入Function, 有参数,有返回值。 map会对每一个元素映射为另一个返回值,并生成新类型的stream流。

  • peek

stream().peek(Consumer action); 要求传入Consumer,有参数,无返回值。 peek会操作每一个元素,但返回原来的流。

  • forEach

stream().forEach(Consumer action);要求传入Consumer,有参数,无返回值。但forEach不再返回流了,是一个流结束函数。

  • collect

stream().collect(); 有两个重载方法参数列表,都不再返回流,而是返回某种集合类型。

    <R> R collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner);
    <R, A> R collect(Collector collector); 
    // Collector接口中,也规范了supplier(),accumulator(),combiner()方法,本质和上面差不多
  • toMap

stream().collect(Collectors.toMap());
Collectors.toMap(), 有三个重载方法参数列表

// 两个Function类型参数 key,value, 实际上是去调用另一个重载方法,throwingMerger():当key相同时,会抛出异常;
Collector toMap(Function keyMapper, Function valueMapper) {
        return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
}
// 两个Function类型参数 key,value + 一个父类为BiFunction的mergeFunction,BiFunction接收两个参数,聚合后一个返回值:当key相同时,如何合并。
Collector toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction) {
        return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
}
// 实际上他们都是调用四个参数的重载方法,对传入的mergeFunction,也是使用java.util.Map中的merge方法来合并
Collector toMap(Function keyMapper,Function valueMapper,BinaryOperator mergeFunction,Supplier<M> mapSupplier) {
        BiConsumer accumulator = (map, element) -> map.merge(keyMapper.apply(element),  valueMapper.apply(element), mergeFunction);
        return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
}
  • 其他stream流常用API
    stream().distinct()
    stream().count()
    stream().sorted()
    stream().findFirst()
    stream().findAny()
    stream().anyMatch()
    stream().allMatch()
    stream().noneMatch()
    stream().max()
    stream().min()
    .stream().toArray(IntFunction<A[]> generator) // 返回指定类型的数组 A[] toArray(IntFunction<A[]> generator)

Optional中filter、map、ifPresent

  • map
Optional.ofNullable(customer).map(Function mapper)

在Optional中,map也是要求传入Function,有参数,有返回值,map返回一个新类型的Optional,

  • filter
Optional.ofNullable(customer).filter(Predicate p)

filter也是要求传入 Predicate,有参数,且返回布尔值,返回原类型的Optional,

  • ifPresent
Optional.ofNullable(customer).ifPresent(Consumer action);

而ifPresent与forEach类似,要求传入Consumer,有参数,无返回值,且结束后不再返回Optional,结束这个Optional。

Runnable、Closeable 也是函数式接口

(无参数,无返回值)

  • Runnable
@FunctionalInterface
public interface Runnable {
    public abstract void run();
}
  • Closeable
public interface Closeable extends AutoCloseable {
    public void close() throws IOException;
}

匿名内部类

在不熟悉Runnable、Function、Consumer、BiFunction、BiConsumer区别时,可以new Runnable()并按提示生成匿名内部类
例如:

 new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("hello word!");
    }
});

再按提示转成lambda,但明确这几项函数式接口的参数和返回值后,可以直接写lambda

直接写lambda表达式

  • Runnable: 无参数,无返回值。直接写出lambda:
  ()->{System.out.println("hello word!");} 

方法体只有一行省略掉大括号:()->System.out.println(“hello word!”)

  • Predicate:有参数,需要返回值(布尔)。直接写出lambda:
  (e)->{return e.getId() > 0;}

参数只有一个可以省略括号,方法体加返回只有一行又可以省略大括号和return关键字:e-> e.getId() > 0

  • Function:有参数,有返回值。直接写出lambda:
  (e)->{return e.getId();}

参数只有一个可以省略括号,方法体加返回只有一行又可以省略大括号和return关键字:e->e.getId()

e是上一步函数的返回值作为当前函数参数,又可省略到参数声明,方法引用:Customer::getId

  • Consumer:有参数,无返回值。直接写出lambda:
  (e)->{system.out.println(e);}

参数只有一个可以省略括号,但方法体只有一行又可以省略大括号:e->System.out.println(e)

e是上一步函数的返回值作为当前函数参数并又作为参数传入sout,又可省略到参数声明,方法引用:System.out::println

  • BiConsumer:有两个参数,无返回值。直接写出lambda:
  (k1, k2)->{System.out.println(k1 + k2);}

参数大于1不能省略小括号,但方法体只有一行又可以省略大括号:(k1, k2)->System.out.println(k1 + k2)

  • BiFunction:有两个参数,有返回值。直接写出lambda:
  (k1, k2)->{return k1 + k2;}

参数大于1不能省略小括号,但方法体加返回只有一行又可以省略大括号和return关键字:(k1, k2)->k1 + k2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1961283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于 AGGLIGATOR(猛禽)网络宽频聚合器

AGGLIGATOR 是一个用于多个链路UDP/IP带宽聚合的工具软件&#xff0c;类似MTCP的作用&#xff0c;不过它是针对UDP/IP宽频聚合的。 举个例子&#xff1a; 中国大陆有三台公网服务器&#xff0c;中国香港有一台大带宽服务器。 那么&#xff1a; AGGLIGATOR 允许中国大陆的客户…

【C++高阶】:深入探索C++11

✨ 心似白云常自在&#xff0c;意如流水任东西 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f4…

Prometheus+Grafana+Alertmanager监控告警

PrometheusGrafanaAlertmanager告警 Alertmanager开源地址&#xff1a;github.com/prometheus Prometheus是一款基于时序数据库的开源监控告警系统&#xff0c;它是SoundCloud公司开源的&#xff0c;SoundCloud的服务架构是微服务架构&#xff0c;他们开发了很多微服务&#xf…

【实际源码】工厂进销存管理系统(仓库、采购、生产、销售)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本&#xff0c;并实时掌握各环节的运营状况。 在采购管理方面&#xff0c;系统能够处理采购订单、供应商管理和采购入库等流程&#xff…

亚马逊云科技 re:Inforce 2024中国站大会

亚马逊云科技 re:Inforce 2024中国站大会 - 生成式AI时代的全面安全&#xff0c;将于7月25日本周四在北京富力万丽酒店揭幕

向量数据库(二):Qdrant

写在前面 我们借助 Qdrant 来了解向量数据库的一些内容 内容 什么是 Qdrant? Qdrant 是一个开源的针对向量相似性搜索的引擎,它提供了一系列的 API 用于对向量数据进行存储、搜索和管理等功能。 下面是来自 Qdrant 官网的一个架构图: 初步了解 Qdrant 里的一些概念 …

h5页面 打开自动跳转小程序

移动端项目中打开页面&#xff0c;直接跳转到小程序功能效果图 pc mobile 代码 样式代码css&#xff1a; <style>* {margin: 0;padding: 0;}html,body {height: 100%;}.full {position: absolute;top: 0;bottom: 0;left: 0;right: 0;}.public-web-container {displa…

每日OJ_牛客CM26 二进制插入

目录 牛客CM26 二进制插入 解析代码 牛客CM26 二进制插入 二进制插入_牛客题霸_牛客网 解析代码 m:1024&#xff1a;100000000 00 n:19 &#xff1a; 10011 要把n的二进制值插入m的第j位到第i位&#xff0c;只需要把n先左移j位&#xff0c;然后再进行或运算&#xff08;|&am…

JS知识点巩固

目录 前言 一、reduce方法 二、二维数组的行和列交换 总结 前言 这里的知识点记录的是日常生活中容易搞忘的知识点 一、reduce方法 function(total,currentValue, index,arr) redece可以用作累加&#xff1a;可以传入初始值&#xff0c;如果传入初始值&#xff0c;则从累加…

【FAS】《The Research of RGB Image Based Face Anti-Spoofing》

文章目录 1、原文2、相关工作3、基于特征解耦的人脸活体检测算法3.1、方法3.2、实验结果 4、基于解构与组合的人脸活体检测方法4.1、方法4.2、实验 5、作者总结6、结论&#xff08;own&#xff09;7、附录7.1、CycleGAN7.2、InfoGAN7.3、3D Face 1、原文 [1]张克越.基于RGB图像…

项目成功秘诀:工单管理系统如何加速进程

国内外主流的10款项目工单管理系统对比&#xff1a;PingCode、Worktile、浪潮云工单管理系统、华为企业智能工单系统、金蝶云苍穹、紫光软件管理系统、Jira、Asana、ServiceNow、Smartsheet。 在管理日益复杂的个人项目时&#xff0c;找到一款能够真正符合需求的管理软件&#…

Stable Diffusion 图生图

区别于文生图&#xff0c;所谓的图生图&#xff0c;俗称的垫图&#xff0c;就是比文生图多了一张参考图&#xff0c;由参考一张图来生成图片&#xff0c;影响这个图片的要素不仅只靠提示词了&#xff0c;还有这个垫图的因素&#xff0c;这个区域就上上传垫图的地方&#xff0c;…

二叉树--堆(下卷)

二叉树–堆&#xff08;下卷&#xff09; 如果有还没看过上卷的&#xff0c;可以看这篇&#xff0c;链接如下&#xff1a; http://t.csdnimg.cn/HYhax 向上调整算法 堆的插⼊ 将新数据插⼊到数组的尾上&#xff0c;再进⾏向上调整算法&#xff0c;直到满⾜堆。 &#x1f4…

Monaco 使用 LinkedEditingRangeProvider

Monaco LinkEdit 功能是指同时修改同样的字符串&#xff0c;例如在编辑 Html 时&#xff0c;修改开始标签时会同时修改闭合标签。Monaco 支持自定义需要一起更新的字符串列表。最终效果如下&#xff1a; 首先&#xff0c;通过 registerLinkedEditingRangeProvider 注册 LinkEd…

day17(nginx反向代理)

反向代理 安装nginx 1.26.1 平滑升级 负载均衡 1.nginx 反向代理配置 反向代理&#xff1a;⽤户直接访问反向代理服务器就可以获得⽬标服务器 &#xff08;后端服务器&#xff09;的资源。 反向代理效果&#xff1a;当访问200主机&#xff08;web1&#xff09;&#xff0c;&a…

vite instanceof 失效

背景&#xff1a;给一个巨石单体项目进行标准化模块拆分&#xff0c;封装出来的模块代码用 vite 进行构建&#xff0c;但模块启动后页面上的表现一直和 webpack 那版不一致 一步步 debug 后&#xff0c;发现问题出在下面这个判断条件 const GeneratorFunction function* () …

解决jenkins配置extendreport不展示样式

下载插件&#xff1a;Groovy 、 HTML Publisher plugin 配置&#xff1a; 1&#xff09;Post Steps &#xff1a; 增加 Execute system Groovy script &#xff0c; 内容&#xff1a; System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "&qu…

【React】详解 React Router

文章目录 一、React Router 的基本概念1. 什么是 React Router&#xff1f;2. React Router 的主要特性 二、React Router 的核心组件1. BrowserRouter2. Route3. Link4. Switch 三、React Router 的使用方法1. 安装 React Router2. 定义路由组件3. 配置路由4. 启动应用 四、Re…

再谈istio

微服务之间调用观测&#xff0c; istio的版本是对k8s 版本有要求的&#xff0c;案例中 istioshi 1.15.2 版本的 一、下载 Istio 二、部署 egressgateway 和 ingressgateway 分别控制进出 istio 通过 Envoy proxy&#xff0c;也就是pod加边车的方式来控制用户对svc的访问 这样…

Spring验证码

前言&#xff1a;使用Hutool 1.什么是Hutool&#xff1f; 2.代码复制到test类中 3.代码爆红&#xff0c;说明需要引入依赖 4.根据名取Maven仓库相关依赖 5.在pom.xml文件中进行配置 6.引入成功 7. 运行程序 打开d盘&#xff0c;发现已经生成了验证码的图片&#xff0c;路径在…