List集合根据对象某个元素去重

序言

检视代码时有下面这样一段代码(已脱敏处理),

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;public class RemoveDuplicateDemo {@Data@NoArgsConstructor@AllArgsConstructorstatic class A {private String aliasName;private int age;}@Data@NoArgsConstructor@AllArgsConstructorstatic class B {private String name;private int age;}private static List<B> removeDuplicateOrigin(List<A> list) {List<B> listB = new ArrayList<>();if (CollectionUtils.isNotEmpty(list)) {Set<String> allName = list.stream().map(A::getAliasName).collect(Collectors.toSet());for (String aliasName : allName) {B b = new B();b.setName(aliasName);listB.add(b);}}return listB;}public static void main(String[] args) {List<A> list = Arrays.asList(new A("tom", 15), new A("john", 16), new A("tim", 11), new A("tom", 30));System.out.println(removeDuplicateOrigin(list));}
}

先思考一下,这样写是否有问题?乍一看,功能上好像没有太大问题。
两个对象A和B,把A对象集合中根据别名进行去重放到B对象集合中。

但实际上有好几处可以优化的地方:

  • 1)方法第一行先就创建了一个初始容量为10的数组,假设A对象集合是空的,那么你平白无故创建了一个集合没有任何作用。判空逻辑建议提前。
  • 2)使用stream流遍历了一遍A对象集合,后面又重新遍历了一遍A集合的结果集,且A对象的所有元素不能赋值到B对象集合。

改进建议

  • 1)使用卫语句减少逻辑嵌套;
  • 2)使用HashMap减少遍历次数;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import org.apache.commons.collections4.CollectionUtils;import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;public class RemoveDuplicateDemo {@Data@NoArgsConstructor@AllArgsConstructorstatic class A {private String aliasName;private int age;}@Data@NoArgsConstructor@AllArgsConstructorstatic class B {private String name;private int age;}private static List<B> removeDuplicate(List<A> list) {if (CollectionUtils.isEmpty(list)) {return new ArrayList<>();}// 去重return list.stream().filter(distinctKey(A::getAliasName)).map(RemoveDuplicateDemo::buildB).collect(Collectors.toList());}public static void main(String[] args) {List<A> list = Arrays.asList(new A("tom", 15), new A("john", 16), new A("tim", 11), new A("tom", 30));System.out.println(removeDuplicate(list));}private static Predicate<? super A> distinctKey(Function<? super A, ?> key) {Map<Object, Boolean> map = new ConcurrentHashMap<>();return t -> map.putIfAbsent(key.apply(t), Boolean.TRUE) == null;}private static B buildB(A a) {B b = new B();b.setName(a.getAliasName());b.setAge(a.getAge());return b;}
}

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

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

相关文章

力扣0107——二叉树的层序遍历II

二叉树的层序遍历II 难度&#xff1a;中等 题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09; 示例1 输入&#xff1a; inorder [9,3,15,20…

docker 部署xxl-job

docker 部署xxl-job XXL-JOB github地址 https://github.com/xuxueli/xxl-job XXL-JOB 文档地址 https://www.xuxueli.com/xxl-job/ XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品…

利用ChatGPT提升工作效率的专业指南

利用ChatGPT提升工作效率的专业指南 一、引言 在数字化时代&#xff0c;人工智能助手已经成为提高工作效率的必备工具。其中&#xff0c;ChatGPT以其强大的自然语言处理能力&#xff0c;为我们提供了全新的工作方式。本文将深入探讨如何利用ChatGPT在各个工作领域中提升效率&a…

ChatGPT与文心一言:智能回复与语言准确性的较量

在当今数字化时代&#xff0c;随着人们对智能化技术的需求不断增长&#xff0c;智能回复工具也成为了日常生活中不可或缺的一部分。ChatGPT和文心一言作为两个备受瞩目的智能回复工具&#xff0c;在智能回复、语言准确性以及知识库丰富度等方面各有卓越之处。 本文将对这两者进…

LPC系列一个定时器不同频率

1.背景 最近研究的LPC804里只有一个ctimer&#xff0c;很多时候用的捉襟见肘的&#xff0c;官方给了一份双匹配的参考例程&#xff0c;不过实际用处不大。不过我花了一晚上的时间&#xff0c;终于研究出来将一个定时器拆成四个定时器用的办法了。这个方法适用于用回调函数的LP…

贪吃蛇游戏的实现

一.技术要点: 贪吃蛇需要掌握: c语言函数,枚举,结构体,动态内存管理,预处理指令,链表,Win32 API等 二.Win32 API 1.Win32 API简介 windows可以帮应用程序卡其视窗,描绘图案,使用周边设备,,Win32 API就是windows32位平台上的应用程序编程接口 2.控制台程序 (1).使用cmd命令…

Pycharm连接云算力远程服务器(AutoDL)训练深度学习模型全过程

前言&#xff1a;在上一篇windows搭建深度学习环境中&#xff0c;我试图使用笔记本联想小新air14的mx350显卡训练一个图像检测的深度学习模型&#xff0c;但是训练时长大概需要几天时间远超我的预期&#xff0c;所以我便选择租用GPU进行训练&#xff0c;在对多家平台对比后找到…

练习12.6_横向射击_Python编程:从入门到实践(第3版)

编写一个游戏&#xff0c;将一艘飞船放在屏幕左侧&#xff0c;并允许玩家上下移动飞船。在玩家按空格键时&#xff0c; 让飞船发射一颗在屏幕中向右飞行的子弹&#xff0c;并在子弹从屏幕中消失后将其删除。 ship_shooting.py import pygame import sys from leftship impor…

玩转WEB接口之三续篇【HTTPS证书申请 - nginx验证】

文章目录 一&#xff0c; 概述二&#xff0c;nginx下载三&#xff0c;访问域名1. 做域名映射2. 运行nginx并通过域名访问 四&#xff0c;配置SSL证书1. 配置证书文件2. nginx 添加证书文件 五、运行并验证1. 测试、重新加载2. https访问 一&#xff0c; 概述 接上篇 玩转WEB接…

Mac下查看、配置和使用环境变量

Mac下查看、配置和使用环境变量 一&#xff1a;Mac怎么查看环境变量命令 printenv一&#xff1a;这个命令会一次性列出所有环境变量的键值对&#xff0c;输出格式为&#xff1a; VAR1value1 VAR2value2 ...二&#xff1a; 也可以通过给这个命令加上环境变量名参数&#xff0…

力扣hot100 每日温度 单调递减栈

Problem: 739. 每日温度 文章目录 思路复杂度&#x1f49d; 单调栈 思路 &#x1f469;‍&#x1f3eb; 参考题解 复杂度 ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( n ) O(n) O(n) &#x1f49d; 单调栈 class Solution {public int[] dailyTem…

二叉树--230. 二叉搜索树中第K小的元素/medium 理解度A

230. 二叉搜索树中第K小的元素 1、题目2、题目分析3、复杂度最优解代码示例4、适用场景 1、题目 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 1 开始计数&#xff09;。 示例 1&#xff1a…

《Docker极简教程》--目录

一、前言 本书的目的和目标Docker的简介 二、Docker基础 Docker的历史和发展Docker的工作原理Docker的主要组件 三、Docker环境的搭建 在Windows上搭建Docker环境在Mac上搭建Docker环境在Linux上搭建Docker环境 四、Docker镜像 Docker镜像的概念Docker镜像的创建和使用D…

【笔记】Helm-4 最佳实践-6 pod和pod模板

pod和pod模板 最佳实践的这部分讨论在chart清单中格式化Pod和Pod模板部分。 以下&#xff08;非详尽的&#xff09;资源列表使用Pod模板&#xff1a; Deployment ReplicationController ReplicaSet DaemonSet StatefulSet 镜像 容器镜像应该使用固定的tag或镜像SHA。不应…

C++面试:算法的执行效率和资源消耗、时间和空间复杂度分析根据实际场景,选用合适的数据结构和算法进行程序设计

目录 算法的执行效率和资源消耗、时间和空间复杂度分析 执行效率和资源消耗 时间复杂度分析 空间复杂度分析 实际应用 面试技巧 根据实际场景&#xff0c;选用合适的数据结构和算法进行程序设计 所根据原则 实例 如何选择数据结构示例 合适的数据结构&#xff1a;哈…

【Linux】动态库和静态库——动态库和静态库的打包和使用、gcc编译、拷贝到系统默认的路径、建立软连接

文章目录 动态库和静态库1.静态库和动态库的介绍2.静态库的打包和使用2.1生成静态库2.2使用静态库的三种方式2.2.1gcc编译2.2.2拷贝到系统默认的路径2.2.3建立软连接 3.动态库的打包和使用3.1生成动态库3.2使用动态库3.3解决加载不到动态库的方法 动态库和静态库 1.静态库和动…

多线程 之 静态代理

什么是静态代理&#xff1f; 静态代理是一种思想&#xff0c;找一个代理负责一些琐事&#xff0c;自己则专注于一件大事。 有哪些具体的表现&#xff1f; 在日常生活中做饭就是这样&#xff0c;会做饭的人需要做饭&#xff0c;那么其他的人就来帮他打杂&#xff0c;这样做饭的…

JavaScript的冒泡与捕获

1.概念。 冒泡事件&#xff1a;微软公司提出的&#xff0c;事件由子元素传递到父元素的过程叫做冒泡&#xff08;false&#xff09;。 捕获事件&#xff1a;网景公司提出的&#xff0c;事件由父元素传递到子元素的过程叫做事件捕获&#xff08;ture&#xff09;。 2.冒泡事件与…

vscode copilot怎么去掉提示代码(ghost text or incline completion)

原因&#xff1a;最近在刷题&#xff0c;被这个提示烦死了&#xff0c;记录一下怎么关掉&#xff0c;防止将来需要开启找不到了XD. 1.直接ctrlshiftp召唤设置 2.输入preferences: open usr settings找到如图第一个 3.去掉这个方框的勾选 ps直接在extension里disable不行呢 不…

使用宝塔面板部署Node.js+Mysql服务和Vue3-Admin项目到云服务器上

准备工作 一台云服务器&#xff0c;可以先用免费试用一个月的服务器进行练手&#xff1b;我这里选择的是腾讯云的轻量云服务器&#xff1b; 1、在云服务器上安装宝塔面板 宝塔面板官网地址&#xff1a;https://www.kancloud.cn/chudong/bt2017/424209 1.1 安装Xshell脚本工…