技术总监写的十个方法,让我精通了lambda表达式

技术总监写的十个方法,让我精通了lambda表达式

  • Collection 转化为 Map
    • 使用样例
    • 代码展示
  • Map格式转换
    • 转换 Map 的 Value
      • 测试样例
      • 代码展示
  • 集合类型转化
    • Collection 和 List、Set 的转化
      • 测试样例
  • List、Set 类型之间的转换
      • 测试样例

前公司的技术总监写了工具类,对Java Stream 进行二次封装,使用起来非常爽,全公司都在用。

我自己照着写了一遍,改了名字,分享给大家。

一共整理了10个工具方法,可以满足 Collection、List、Set、Map 之间各种类型转化。例如

  1. Collection<OrderItem> 转化为 List<OrderItem>
  2. Collection<OrderItem> 转化为 Set<OrderItem>
  3. List<OrderItem> 转化为 List<Long>
  4. Set<OrderItem> 转化为 Set<Long>
  5. Collection<OrderItem> 转化为 List<Long>
  6. Collection<OrderItem> 转化为 Set<Long>
  7. Collection<OrderItem>中提取 Key, Map 的 Value 就是类型 OrderItem
  8. Collection<OrderItem>中提取 Key, Map 的 Value 根据 OrderItem 类型进行转化。
  9. Map<Long, OrderItem> 中的value 转化为 Map<Long, Double>
  10. value 转化时,lamada表达式可以使用(v)->{},也可以使用 (k,v) -> { }
    Collection 集合类型到 Map类型的转化。

Collection 转化为 Map

由于 List 和 Set 是 Collection 类型的子类,所以只需要实现Collection 类型转化为 Map 类型即可。 Collection转化为 Map 共分两个方法

  1. Collection<OrderItem>Map<Key, OrderItem>,提取 Key, Map 的 Value 就是类型 OrderItem
  2. Collection<OrderItem>Map<Key,Value> ,提取 Key, Map 的 Value 根据 OrderItem 类型进行转化。

使用样例

代码示例中把Set<OrderItem> 转化为 Map<Long, OrderItem>Map<Long ,Double>

@Test
public void testToMap() {Collection<OrderItem> collection = coll;Set<OrderItem> set = toSet(collection);Map<Long, OrderItem> map = toMap(set, OrderItem::getOrderId);
}@Test
public void testToMapV2() {Collection<OrderItem> collection = coll;Set<OrderItem> set = toSet(collection);Map<Long, Double> map = toMap(set, OrderItem::getOrderId, OrderItem::getActPrice);
}

代码展示

public static <T, K> Map<K, T> toMap(Collection<T> collection, Function<? super T, ? extends K> keyMapper) {return toMap(collection, keyMapper, Function.identity());
}public static <T, K, V> Map<K, V> toMap(Collection<T> collection,Function<? super T, ? extends K> keyFunction,Function<? super T, ? extends V> valueFunction) {return toMap(collection, keyFunction, valueFunction, pickSecond());
}public static <T, K, V> Map<K, V> toMap(Collection<T> collection,Function<? super T, ? extends K> keyFunction,Function<? super T, ? extends V> valueFunction,BinaryOperator<V> mergeFunction) {if (CollectionUtils.isEmpty(collection)) {return new HashMap<>(0);}return collection.stream().collect(Collectors.toMap(keyFunction, valueFunction, mergeFunction));
}public static <T> BinaryOperator<T> pickFirst() {return (k1, k2) -> k1;
}
public static <T> BinaryOperator<T> pickSecond() {return (k1, k2) -> k2;
}

Map格式转换

转换 Map 的 Value

  1. 将 Map<Long, OrderItem> 中的value 转化为 Map<Long, Double>
  2. value 转化时,lamada表达式可以使用(v)->{}, 也可以使用 (k,v)->{ }。

测试样例

@Test
public void testConvertValue() {Collection<OrderItem> collection = coll;Set<OrderItem> set = toSet(collection);Map<Long, OrderItem> map = toMap(set, OrderItem::getOrderId);Map<Long, Double> orderId2Price = convertMapValue(map, item -> item.getActPrice());Map<Long, String> orderId2Token = convertMapValue(map, (id, item) -> id + item.getName());}

代码展示

public static <K, V, C> Map<K, C> convertMapValue(Map<K, V> map, BiFunction<K, V, C> valueFunction,BinaryOperator<C> mergeFunction) {if (isEmpty(map)) {return new HashMap<>();}return map.entrySet().stream().collect(Collectors.toMap(e -> e.getKey(),e -> valueFunction.apply(e.getKey(), e.getValue()),mergeFunction));
}public static <K, V, C> Map<K, C> convertMapValue(Map<K, V> originMap, BiFunction<K, V, C> valueConverter) {return convertMapValue(originMap, valueConverter, Lambdas.pickSecond());
}public static <T> BinaryOperator<T> pickFirst() {return (k1, k2) -> k1;
}
public static <T> BinaryOperator<T> pickSecond() {return (k1, k2) -> k2;
}

集合类型转化

Collection 和 List、Set 的转化

  1. Collection<OrderItem> 转化为 List<OrderItem>
  2. Collection<OrderItem> 转化为 Set<OrderItem>
public static <T> List<T> toList(Collection<T> collection) {if (collection == null) {return new ArrayList<>();}if (collection instanceof List) {return (List<T>) collection;}return collection.stream().collect(Collectors.toList());
}public static <T> Set<T> toSet(Collection<T> collection) {if (collection == null) {return new HashSet<>();}if (collection instanceof Set) {return (Set<T>) collection;}return collection.stream().collect(Collectors.toSet());
}

测试样例

@Test//将集合 Collection 转化为 List
public void testToList() {Collection<OrderItem> collection = coll;List<OrderItem> list = toList(coll);
}@Test//将集合 Collection 转化为 Set
public void testToSet() {Collection<OrderItem> collection = coll;Set<OrderItem> set = toSet(collection);
}

List和 Set 是 Collection 集合类型的子类,所以无需再转化。

List、Set 类型之间的转换

业务中有时候需要将 List<A> 转化为 List<B>。如何实现工具类呢?

public static <T, R> List<R> map(List<T> collection, Function<T, R> mapper) {return collection.stream().map(mapper).collect(Collectors.toList());
}public static <T, R> Set<R> map(Set<T> collection, Function<T, R> mapper) {return collection.stream().map(mapper).collect(Collectors.toSet());
}public static <T, R> List<R> mapToList(Collection<T> collection, Function<T, R> mapper) {return collection.stream().map(mapper).collect(Collectors.toList());
}public static <T, R> Set<R> mapToSet(Collection<T> collection, Function<T, R> mapper) {return collection.stream().map(mapper).collect(Collectors.toSet());
}

测试样例

  1. List<OrderItem> 转化为 List<Long>
  2. Set<OrderItem> 转化为 Set<Long>
  3. Collection<OrderItem> 转化为 List<Long>
  4. Collection<OrderItem> 转化为 Set<Long>
@Test
public void testMapToList() {Collection<OrderItem> collection = coll;List<OrderItem> list = toList(coll);List<Long> orderIdList = map(list, (item) -> item.getOrderId());
}@Test
public void testMapToSet() {Collection<OrderItem> collection = coll;Set<OrderItem> set = toSet(coll);Set<Long> orderIdSet = map(set, (item) -> item.getOrderId());
}@Test
public void testMapToList2() {Collection<OrderItem> collection = coll;List<Long> orderIdList = mapToList(collection, (item) -> item.getOrderId());
}@Test
public void testMapToSetV2() {Collection<OrderItem> collection = coll;Set<Long> orderIdSet = mapToSet(collection, (item) -> item.getOrderId());}

总结一下 以上样例包含了如下的映射场景

  1. Collection<OrderItem> 转化为 List<OrderItem>
  2. Collection<OrderItem> 转化为 Set<OrderItem>
  3. List<OrderItem> 转化为 List<Long>
  4. Set<OrderItem> 转化为 Set<Long>
  5. Collection<OrderItem> 转化为 List<Long>
  6. Collection<OrderItem> 转化为 Set<Long>
  7. Collection<OrderItem>中提取 Key, Map 的 Value 就是类型 OrderItem
  8. Collection<OrderItem>中提取 Key, Map 的 Value 根据 OrderItem 类型进行转化。
  9. Map<Long, OrderItem> 中的value 转化为 Map<Long, Double>
  10. value 转化时,lamada表达式可以使用(v)->{},也可以使用 (k,v) -> { }

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

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

相关文章

工智能基础知识总结--词嵌入之FastText

什么是FastText FastText是Facebook于2016年开源的一个词向量计算和文本分类工具,它提出了子词嵌入的方法,试图在词嵌入向量中引入构词信息。一般情况下,使用fastText进行文本分类的同时也会产生词的embedding,即embedding是fastText分类的产物。 FastText流程 FastText的架…

计算机组成原理简答题

目录 1、指令和数据在计算机内部以几进制存储&#xff0c;又是如何区分的呢&#xff1f; 2、计算机内部为什么要使用二进制&#xff1f; 3、简单描述计算机系统的层次结构 4、DRAM为什么要进行刷新&#xff0c;如何刷新的&#xff1f; 5、简述不同操作码的指令格式&#xf…

常用Java代码-Java中的多线程编程(Multi-threading)

多线程编程是Java中的一个重要概念&#xff0c;它允许程序在同一时刻执行多个任务&#xff0c;提高程序的执行效率和响应性。在Java中&#xff0c;多线程编程通过创建多个线程并利用线程来执行任务实现。 Java提供了Thread类和Runnable接口来实现多线程编程。Thread类是Java中…

FileStream文件管理

文件管理 FileStream&#xff1a;是一个用于读写文件的一个类。它提供了基于流的方式操作文件&#xff0c;可以进行读取、写入、查找和关闭等操作。 第一个参数&#xff1a;path&#xff08;路径&#xff09; 相对路径&#xff1a;相对于当前项目的bin目录下的Debug和Realse来…

EMD+包络谱故障诊断

EMD是一种信号处理方法,用于将信号分解成多个本征模态函数(Intrinsic Mode Functions,IMF),每个IMF代表信号中的一个固有振动模式。VMD在处理非平稳信号和非线性信号方面具有较好的性能。 包络谱峭度是一种用于描述信号包络频谱形状的特征。它通过对信号包络谱的谱线斜率…

[嵌入式AI从0开始到入土]10_yolov5在昇腾上应用

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第一章 昇腾Altas 200 DK上手 第二章 下载昇腾案例并运行 第三章…

Android 车联网——多屏多用户(十五)

前面几篇文章介绍了多用户和多屏相关的 Manager 和 Service。上一篇文章最后虽然车内乘员都根据配置有自己的对应屏幕,但默认情况下,所有车内乘员依然使用的是当前主用户(司机用户),这一篇我们继续放下看一下用户的创建与分配。 一、用户创建分配 1、创建用户 对于创建用…

【AI视野·今日NLP 自然语言处理论文速览 第七十一期】Fri, 5 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Fri, 5 Jan 2024 Totally 28 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers LLaMA Pro: Progressive LLaMA with Block Expansion Authors Chengyue Wu, Yukang Gan, Yixiao Ge, Zeyu Lu, …

JavaScript实现的复杂功能:自动生成带水印的图片

#程序员的崩溃瞬间 在本文中&#xff0c;我们将讨论一个JavaScript实现的复杂功能&#xff0c;该功能可以自动为图片添加水印。这个功能在许多场景中都非常有用&#xff0c;例如&#xff0c;如果你想保护你的图片版权&#xff0c;或者你想在你的网站上显示自定义的水印。 一、…

java导出word套打

这篇文档手把手教你完成导出word套打&#xff0c;有这个demo&#xff0c;其他word套打导出都通用。 1、主要依赖 <!--hutool--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.3.0</ve…

IPv6路由协议---IPv6动态路由(RIPng)

IPv6动态路由协议 动态路由协议有自己的路由算法,能够自动适应网络拓扑的变化,适用于具有一定数量三层设备的网络。缺点是配置对用户要求比较高,对系统的要求高于静态路由,并将占用一定的网络资源和系统资源。 路由表和FIB表 路由器转发数据包的关键是路由表和FIB表,每…

CreateDIBSection失败的问题记录

错误记录 [ERROR] (:0, ): QPixmap::fromWinHICON(), failed to GetIconInfo() (操作成功完成。) [ERROR] (:0, ): QPixmap::fromWinHICON(), failed to GetIconInfo() (参数错误。) [ERROR] (:0, ): QPixmap::fromWinHICON(), failed to GetIconInfo() (参数错误。) [ERROR] …

升级 Vite 5 出现警告 The CJS build of Vite‘s Node API is deprecated.

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

C++核心编程——内存分区、引用、函数提高和函数重载

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…

数仓建设学习路线(一)

前言 数仓建设实践路线是语兴发布在B站的系列课程&#xff0c;搜索语兴呀即可学习完整的数仓建设理论。 大数据相关岗位 大数据常见的岗位主要包括实时开发、数据治理、数据安全、数据资产等。 其中&#xff1a; 实时开发组的主要任务是实时可视化制作(大屏/彩蛋/战报&…

前端结合MQTT实现连接 订阅发送信息等操作 VUE3

MQTT客户端下载 使用测试 在我之前文章中 MQTT下载基础使用 下面记录一下前端使用的话的操作 1.安装 npm i mqtt引入 import * as mqtt from "mqtt/dist/mqtt.min"; //VUE3 import mqtt from mqtt //VUE2 一、MQTT协议中的方法 Connect。等待与服务器建立连接…

Scanner:键盘输入功能的实现、Java程序获取一个随机数

目录 一、 Scanner&#xff1a;键盘输入功能的实现 二、Java程序获取一个随机数 一、 Scanner&#xff1a;键盘输入功能的实现 如何从键盘获取不同类型&#xff08;基本数据类型、String类型&#xff09;的变量&#xff1a;使用Scanner类 键盘输入代码的四个步骤&#xff1a…

uView Gap 间隔槽

该组件一般用于内容块之间的用一个灰色块隔开的场景&#xff0c;方便用户风格统一&#xff0c;减少工作量 #平台差异说明 App&#xff08;vue&#xff09;App&#xff08;nvue&#xff09;H5小程序√√√√ #基本使用 直接引入即可使用 通过height配置高度&#xff0c;单位…

fmt中uint128_fallback的实现分析

数据结构 class uint128_fallback {private:uint64_t lo_, hi_;public:constexpr uint128_fallback(uint64_t hi, uint64_t lo) : lo_(lo), hi_(hi) {}constexpr uint128_fallback(uint64_t value 0) : lo_(value), hi_(0) {}constexpr uint64_t high() const noexcept { ret…

[VUE]2-vue的基本使用

目录 vue基本使用方式 1、vue 组件 2、文本插值 3、属性绑定 4、事件绑定 5、双向绑定 6、条件渲染 7、axios 8、⭐跨域问题 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅…