首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >自定义list To HashMap工具类

自定义list To HashMap工具类

作者头像
阿超
发布于 2022-08-16 10:53:59
发布于 2022-08-16 10:53:59
34000
代码可运行
举报
文章被收录于专栏:快乐阿超快乐阿超
运行总次数:0
代码可运行

没有比正直更富的遗产。——莎士比亚

我们在使用JDK自带的Collectors.toMap时,可能会遇到如下问题(什么?你不知道toMap干嘛的?戳我了解):

1.key重复,出现java.lang.IllegalStateException: Duplicate key ***异常

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<User> users = new ArrayList<>(Arrays.asList(new User(null, "HiNo"), new User(null, "SuPa")));
Map<String, String> map = users.stream().collect(Collectors.toMap(User::getUsername, User::getPassword));

2.value为空,出现NPE: java.lang.NullPointerException

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<User> users = new ArrayList<>(Arrays.asList(new User("SuPa", null), new User("HiNo", null)));
Map<String, String> map = users.stream().collect(Collectors.toMap(User::getUsername, User::getPassword));

这里我们可以不使用Collectors,而是直接在collect中传入参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map<String, String> map = users.stream().collect(HashMap::new, (m, v) -> m.put(v.getUsername(), v.getPassword()), HashMap::putAll);

或者是在后面追加参数,例如我这篇博客

这样确实可以解决,但每次都要写这一长串,有点难受——本人比较懒,所以写一个工具类

这里是直接put进去,所以不存在说key重复或者为NPE问题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda;
import com.ruben.pojo.User;

import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;

/**
 * @ClassName: FunctionUtils
 * @Description: 我还没有写描述
 * @Date: 2020/11/9 0009 23:43
 * *
 * @author: <achao1441470436@gmail.com>
 * @version: 1.0
 * @since: JDK 1.8
 */
public class FunctionUtils {

    /**
     * @MethodName: toHashMap
     * @Description: list -> hashMap
     * @Date: 2021/1/31 0031 16:17
     * *
     * @author: <achao1441470436@gmail.com>
     * @param: [list, keyFunction, valueFunction]
     * @returnValue: java.util.Map<K, U>
     */
    public static <T, K, U> Map<K, U> toHashMap(List<T> list, Function<T, K> keyFunction, Function<T, U> valueFunction) {
        if (Objects.isNull(list) || list.isEmpty()) {
            return new HashMap<>(0);
        }
        return list.stream().collect(MyCollectors.toHashMap(keyFunction, valueFunction));
    }

    public static <T, K> Map<K, T> toHashMap(List<T> list, Function<T, K> keyFunction) {
        return toHashMap(list, keyFunction, null);
    }

    public static <T> Map<?, T> toHashMap(List<T> list) {
        return toHashMap(list, null, null);
    }

    /**
     * @ClassName: MyCollectors
     * @Date: 2020/12/4 0004 11:16
     * @Description: 我的自定义Collectors
     * @Author: <achao1441470436@gmail.com>
     */
    public static class MyCollectors {
        /**
         * @MethodName: toHashMap
         * @Description: 转换成hashmap
         * @Date: 2020/12/4 0004 13:39
         * *
         * @author: <achao1441470436@gmail.com>
         * @param: [methodName]
         * @returnValue: java.util.stream.Collector
         */
        public static <T, K, U> Collector<T, HashMap<K, U>, HashMap<K, U>> toHashMap(Function<T, K> keyFunction, Function<T, U> valueFunction) {
            return new MyCollectorImpl<>(HashMap::new, (m, v) -> m.put(Optional.ofNullable(keyFunction).map(keyF -> keyF.apply(v)).orElseGet(() -> {
                try {
                    return (K) v.getClass().getMethod("getId").invoke(v);
                } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
                    e.printStackTrace();
                }
                return null;
            }), Optional.ofNullable(valueFunction).map(valueF -> valueF.apply(v)).orElse((U) v)), (u, v) -> null, i -> i, Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH)));
        }

        public static class MyCollectorImpl<T, A, R> implements Collector<T, A, R> {
            private final Supplier<A> supplier;
            private final BiConsumer<A, T> accumulator;
            private final BinaryOperator<A> combiner;
            private final Function<A, R> finisher;
            private final Set<Characteristics> characteristics;

            MyCollectorImpl(Supplier<A> supplier,
                            BiConsumer<A, T> accumulator,
                            BinaryOperator<A> combiner,
                            Function<A, R> finisher,
                            Set<Characteristics> characteristics) {
                this.supplier = supplier;
                this.accumulator = accumulator;
                this.combiner = combiner;
                this.finisher = finisher;
                this.characteristics = characteristics;
            }

            @Override
            public Supplier<A> supplier() {
                return supplier;
            }

            @Override
            public BiConsumer<A, T> accumulator() {
                return accumulator;
            }

            @Override
            public BinaryOperator<A> combiner() {
                return combiner;
            }

            @Override
            public Function<A, R> finisher() {
                return finisher;
            }

            @Override
            public Set<Characteristics> characteristics() {
                return characteristics;
            }
        }
    }
}

使用方式(注意返回值):

指定keyvalue使用它本身

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map<String, User> map = toHashMap(users, User::getUsername);

指定keyvalue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map<String, String> map = toHashMap(users, User::getUsername, User::getPassword);

默认不指定,keyidvalue为它本身的方式(需要有id属性并包含getter

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map<?, User> map = toHashMap(users);
// 可以强转
Map<Integer, User> map = (Map<Integer, User>) toHashMap(users);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-01-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
干货 | 拆解一个 Elasticsearch Nested 类型复杂查询问题
前置说明:本文是线上环境的实战问题拆解,涉及复杂 DSL,看着会很长,但强烈建议您耐心读完。
铭毅天下
2021/07/22
3.2K0
Elasticsearch学习笔记 -- 1
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
earthchen
2020/09/24
4430
干货 | Elasticsearch7.X Scripting脚本使用详解
除了官方文档,其他能找到的介绍Elasticsearch脚本(Scripting)的资料少之又少。
铭毅天下
2019/09/17
15.6K1
elasticsearch压力测试工具之ESrally使用说明
esrally是elastic search官方用于对ES集群进行压力测试的工具,使用esrally可以为我们构建不同版本集群,构造不同的参数和数据来进行压力测试,并且可以对产生的压测结果进行比较,rally顾名思义是拉力赛的意思,esrally的一些名词也都与拉力赛有关。 github地址:https://github.com/elastic/rally
没有故事的陈师傅
2020/08/31
2.3K0
Elasticsearch 8.X:这个复杂的检索需求如何实现?
如上图所示,index中有这样四个字段:title content question answer。要查询这四个字段,支持最多输入5个关键词模糊查询,多关键词以空格隔开。
铭毅天下
2023/09/26
6170
Elasticsearch 8.X:这个复杂的检索需求如何实现?
Elasticsearch - 聚合获取原始数据并分页&排序&模糊查询
在 Elasticsearch 中,cardinality 算法用来计算字段的基数(不重复的值的个数).
小小工匠
2023/05/12
1.5K0
Elasticsearch - 聚合获取原始数据并分页&排序&模糊查询
用 Elasticsearch 统计做了几次核酸检测?怎么破?
这两个问题本质是一类问题,这类问题涉及技术选型、方案选型、实现细节等问题,本篇文章我们一并讨论一下。
铭毅天下
2022/04/06
8140
用 Elasticsearch 统计做了几次核酸检测?怎么破?
干货 | Elasticsearch Nested类型深入详解
本文通过一个例子将Nested类型适合解决的问题、应用场景、使用方法串起来, 文中所有的DSL都在Elasticsearch6.X+验证通过。
铭毅天下
2018/10/24
4.6K0
干货 | Elasticsearch Nested类型深入详解
ElasticSearch基础入门学习笔记
本笔记的内容主要是在从0开始学习ElasticSearch中,按照官方文档以及自己的一些测试的过程。
Ryan-Miao
2020/02/24
5900
【Elasticsearch】Nested嵌套结构数据操作及聚合查询
ES的Nested数据类型允许我们存储一对多的数据,例如一个文章可以对应多个评论等,在正式开始之前,我们先生成一个用于测试的索引:
明月AI
2022/02/23
6.9K0
【Elasticsearch】Nested嵌套结构数据操作及聚合查询
PB数据毫秒级搜索之Elasticsearch(二)基础了解
ES在创建索引时,默认是创建5个分片,一个备份,这个数量是可以修改的,分片是只能创建时修改,备份可以动态修改。在索引中,还存在几个概念:
憧憬博客
2020/07/20
8220
Elasticsearch 8.X 如何依据 Nested 嵌套类型的某个字段进行排序?
如下所示, 希望在查出的结果后, 对结果进行后处理,对tags列表,根据depth进行排序。
铭毅天下
2024/01/11
9430
Elasticsearch 8.X 如何依据 Nested 嵌套类型的某个字段进行排序?
Elasticsearch初检索及高级
PUT customer/external/1 :在 customer 索引下的 external 类型下保存 1号数据
乐心湖
2021/01/18
1.2K0
Elasticsearch初检索及高级
【elasticsearch】进阶检索
HTTP客户端工具(POSTMAN),get请求不能携带请求体,我们变为post也是一样的 我们 POST 一个 JSON 风格的查询请求体到 _search API。 需要了解,一旦搜索的结果被返回,Elasticsearch 就完成了这次请求,并且不会维护任何服务端的资源或者结果的 cursor(游标)
周杰伦本人
2022/10/25
5760
【elasticsearch】进阶检索
Elasticsearch使用:Scripting API(一)
官方7.9版本:https://www.elastic.co/guide/en/elasticsearch/reference/7.9/modules-scripting.html
HLee
2020/12/09
3.1K0
Elasticsearch使用:Scripting API(一)
ES查询常见问题
1 must嵌套should条件查询 curl -XGET 'xxx/xxx/_search?pretty' -H 'Content-Type: application/json' -d'{
YG
2018/05/23
8050
干货 |《从Lucene到Elasticsearch全文检索实战》拆解实践
1、题记 2018年3月初,萌生了一个想法:对Elasticsearch相关的技术书籍做拆解阅读,该想法源自非计算机领域红火已久的【樊登读书会】、得到的每天听本书、XX拆书帮等。 目前市面上Elasticsearch的中文书籍就那么基本,针对ES5.X以上的三本左右;国外翻译有几本,都是针对ES1.X,2.X版本,其中《深入理解Elasticsearch》还算比较经典。 拆书的目的: 1)梳理已有的Elasticsearch知识体系; 2)拾遗拉在角落的Elasticsearch知识点; 3)通过手敲动代码
铭毅天下
2018/04/24
3.5K0
ES 查询优化(一)
1、能用term就不用match_phrase The Lucene nightly benchmarks show that a simple term query is about 10 times as fast as a phrase query, and about 20 times as fast as a proximity query (a phrase query with slop). term查询比match_phrase性能要快10倍,比带slop的match_phrase快2
YG
2018/05/23
5K1
ElasticSearch 权威指南笔记
使用 DSL(Domain Specific Language)特定领域语言**)**查询
operator开发工程师
2023/11/16
3530
ElasticSearch 权威指南笔记
Elasticsearch学习-嵌套文档
最近一段时间都在搞Elasticsearch搜索相关的工作,总结一下搜索知识点供大家参考。
dalaoyang
2020/05/17
1.2K0
推荐阅读
相关推荐
干货 | 拆解一个 Elasticsearch Nested 类型复杂查询问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档