Java遍历Map五种方法

article/2025/9/23 2:28:05

一、Map集合遍历日常开发最常使用,简单总结五种方法差异。

       ①、Iterator+entrySet写法【推荐JDK8以下】,Map.Entry是Map接口的内部接口,获取迭代器,然后依次取出每个迭代器里面的Map.Entry

        Iterator<Map.Entry<Integer,String>> iterator=map.entrySet().iterator();while(iterator.hasNext()){Map.Entry<Integer,String> entry=iterator1.next();System.out.println(entry.getKey());System.out.println(entry.getValue());}

      ②、Iterator+keyset写法【不推荐,只能获取key,然后通过key获取对应的value,重复计算】

        Iterator<Integer> iterator=map.keySet().iterator();while (iterator.hasNext()){Integer key=iterator.next();System.out.println(key);System.out.println(map.get(key));}

     ③、foreach遍历方式【JDK8以下推荐写法】

        for(Map.Entry<Integer,String> entry:map.entrySet()){System.out.println(entry.getKey());System.out.println(entry.getValue());};

     ④:lambda表达式遍历【JDK8推荐写法,简捷】

        map.forEach((key,value)->{System.out.println(key);System.out.println(value);});

    ⑤:stream流遍历Map【JDK8不推荐写法,重复计算】

        map.entrySet().stream().forEach((Map.Entry<Integer, String> entry) -> {System.out.println(entry.getKey());System.out.println(entry.getValue());});

  如果Map集合存在一些中间处理,可以过滤操作,使用流式遍历也很方便。

  附【List和Map删除集合元素】,业务实现里面经常需要清理集合中的指定的对象,这里以List和Map为例介绍一下正常的删除方式。

 JDK8以下写法,迭代器会动态感知集合的变化。

List<Integer> list=new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);
Iterator<Integer> integerIterator=list.iterator();while(integerIterator.hasNext()){Integer integer=integerIterator.next();if(integer.equals(5)){integerIterator.remove();}}
System.out.println(list);

JDK8及以上的写法,新增一个removeIf方法

list.removeIf(key ->key.equals(4));

Map的写法。

JDK1.8一下

        Iterator<Map.Entry<String,String>> iterator=map.entrySet().iterator();while(iterator.hasNext()){Map.Entry<String, String> entry=iterator.next();if(entry.getKey().equals("2")){iterator.remove();}}

JDK1.8及以上

map.keySet().removeIf(key -> key.equals("3"));

【附录 JAVA的ArrayList的遍历方式】

    public static void main(String[] args) {// 1、普通for循环遍历List<String> list = getList();for(int i=0;i<list.size();i++){System.out.println(list.get(i));}// 2、迭代器遍历Iterator<String> iterator = list.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}// 3、增强for-each遍历,底层通过迭代器遍历实现,迭代器遍历提供容器统一遍历接口for(String str:list){System.out.println(str);}// 4、Lambda遍历list.stream().forEach(str->{System.out.println(str);});// 5、ListIterator迭代,前向迭代ListIterator<String> listIterator = list.listIterator();while(listIterator.hasNext()){System.out.println(listIterator.next());}// 6、ListIterator迭代,反向迭代while(listIterator.hasPrevious()){System.out.println(listIterator.previous());}
}private static List<String> getList() {List<String> list=new ArrayList<>();list.add("Map");list.add("HashMap");list.add("LinkedHashMap");list.add("TreeMap");list.add("ConcurrentHashMap");return list;
}

附录:开发中常用的各种类型List集合,util包下

import java.util.Collections;

        // 1、空集合,底层自定义一个EmptyList实现,接口空list返回,不像new ArrayList分配不必要的内存空间Collections.emptyList();// 2、单值List,底层定义SingletonList,size为1Collections.singletonList(new Object());// 3、线程安全的List,底层定义SynchronizedList,方法定义通过synchronized代码实现线程安全,定义了一个SynchronizedCollectionCollections.synchronizedList(new ArrayList<>());// 4、不可变List,不支持修改,定义一个UnmodifiableCollection,UnmodifiableListCollections.unmodifiableList(new ArrayList<>());

 List转换Map整理.

/**
* 转换Map,保存后者
* @return Map<String,Book>
*/
private static Map<String,Book> convertOldValueMap(){List<Book> bookList=new ArrayList<>();bookList.add(new Book("The King","Tom","1955"));bookList.add(new Book("The King Tail","Jack","1956"));bookList.add(new Book("The King Tail","Bean","1957"));bookList.add(new Book("The King Help","Bean","1957"));// 注意Key值重复时处理,这里是保存旧的值,之前加入的数据// Function<? super T, ? extends K> keyMapper// Function<? super T, ? extends U> valueMapper->Function.identity()// BinaryOperator<U> mergeFunctionreturn bookList.stream().collect(Collectors.toMap(Book::getReleaseYear, Function.identity(),(oldValue,newValue)->oldValue));
}@Data
@AllArgsConstructor
@NoArgsConstructor
class Book{private String name;private String author;private String releaseYear;
}

①、合并不覆盖旧值.

/*** 转换Map,保存后者* @return Map<String,Book>*/
private static Map<String,Book> convertNewValueMap(){List<Book> bookList=new ArrayList<>();bookList.add(new Book("The King","Tom","1955"));bookList.add(new Book("The King Tail","Jack","1956"));bookList.add(new Book("The King Tail","Bean","1957"));bookList.add(new Book("The King Help","Bean","1957"));// 注意Key值重复时处理,这里是保存新的值,也就是后面加入的数据// Function<? super T, ? extends K> keyMapper// Function<? super T, ? extends U> valueMapper->Function.identity()// BinaryOperator<U> mergeFunctionreturn bookList.stream().collect(Collectors.toMap(Book::getReleaseYear, Function.identity(),(oldValue,newValue)->newValue));
}

 ②、合并覆盖旧值.

List对象属性分组过滤
class UserInfo{private Long id;private String name;private Integer age;public UserInfo(Long id, String name, Integer age) {this.id = id;this.name = name;this.age = age;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "UserInfo{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;UserInfo userInfo = (UserInfo) o;return Objects.equals(id, userInfo.id) &&Objects.equals(name, userInfo.name) &&Objects.equals(age, userInfo.age);}@Overridepublic int hashCode() {return Objects.hash(id, name, age);} 
}

  List对象去重,记得重写hashcode和equals方法.

List<UserInfo> infoList = userInfoList.stream().distinct().collect(Collectors.toList());
System.out.println(infoList);
        List<UserInfo> userInfoList=new ArrayList<>();userInfoList.add(new UserInfo(1L, "Tom", 23));userInfoList.add(new UserInfo(2L, "Jack", 24));userInfoList.add(new UserInfo(3L, "Luck", 25));userInfoList.add(new UserInfo(4L, "Luck", 26));// Stream属性分组过滤Map<String, List<UserInfo>> collect = userInfoList.stream().collect(Collectors.groupingBy(UserInfo::getName));System.out.println(collect);

 传统的Map属性分组

        Map<String, List<UserInfo>> result = new HashMap<>();// 转换for(UserInfo userInfo:userInfoList){String name = userInfo.getName();List<UserInfo> list = result.get(name);if(CollectionUtils.isEmpty(list)){list = new ArrayList<>();result.put(name, list);}// 存在直接添加list中即可list.add(userInfo);}

List<Map<String,Object>>过滤指定的值,返回过滤后的集合。

Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)
    public static void testObjectMap(){List<Map<String,Object>> list = new ArrayList<>();Map<String,Object> mapOne = new HashMap<>();mapOne.put("key1","value1");mapOne.put("key2","value2");mapOne.put("key3","value3");mapOne.put("key4","value4");Map<String,Object> mapTwo = new HashMap<>();mapTwo.put("key1","value1");mapTwo.put("key2","value2");mapTwo.put("key3","value3");mapTwo.put("key4","value4");Map<String,Object> mapThree = new HashMap<>();mapThree.put("key1","value1");mapThree.put("key2","value2");mapThree.put("key3","value3");mapThree.put("key4","value4");list.add(mapOne);list.add(mapTwo);list.add(mapThree);// List的条件过滤List<Map<String, Object>> collect = list.stream().map(m -> m.entrySet().stream().filter(map -> !map.getKey().equals("key4")).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))).collect(Collectors.toList());System.out.println(collect);// Map的条件过滤Map<String, Object> result = mapThree.entrySet().stream().filter(map -> !map.getKey().equals("key4")).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));System.out.println(result);}
}

 

 


http://chatgpt.dhexx.cn/article/37phl9FF.shtml

相关文章

443端口被占用怎么办

前段时间配置SDN的时候装了虚拟机&#xff0c;然后最近打开Steam插件访问社区的时候发现跳出错误&#xff0c;443端口被占用&#xff0c;一脸懵逼&#xff0c;后来查找资料才发现原来是虚拟机的vmware-hosted进程占用了443端口 可以通过右键计算机——服务和应用程序——服务—…

当443端口被占用时如何解决?

有时候我们的一些软件需要443端口才能运行&#xff0c;但是443被占用了&#xff0c;应当怎么结束呢&#xff1f; 1&#xff0c;打开CMD&#xff0c;输入netstat -ano回车&#xff0c;如图&#xff1a; 可以看到某程序正在占用443端口&#xff08;左边一列0.0.0.0:443,0.0.0.0代…

steamcom启动服务:443端口被占用,请关闭占用该端口的进程后再点击启动服务!

steamcom启动服务&#xff1a;443端口被占用&#xff0c;请关闭占用该端口的进程后再点击启动服务! 最近想玩玩游戏放松放松&#xff0c;但是steam有点问题&#xff0c;于是下了个插件steamcom,但在启动服务时出现了错误。 过程结果及解决方案 1、下载压缩文件并解压 2、运…

解除445端口的占用

有很多时候,我们测试的时候,会需要用到445端口。而windows默认该端口是开放的,那么我们如何关闭该端口的占用状态呢? 不是通过防火墙阻止445端口的连接来关闭,这种是阻止外部连接,但是本地445端口还是开放的。 我们这里讲的是关闭占用445端口的服务! 关闭Server服务 …

steamcommunity本地反代443端口/80端口被占用解决办法

参考了这两篇文章&#xff1a; https://www.cnblogs.com/chihirotan/p/5785339.html https://blog.csdn.net/mituan1234567/article/details/51085580 太长不看版&#xff1a; 我的电脑最近几天装了VMware&#xff0c;VMware占用了443端口导致steamcommunity无法启动。解决办…

端口被占用但实际端口没被占用

【问题描述】 启动nacos、sentinel时报端口被占用&#xff0c;使用netstat -aon|findstr 8080查找端口使用情况却发现该端口并没有被使用 【问题解决】 原出处&#xff1a;win10系统遇到了一个十分诡异的情况&#xff0c;端口明明没被占用却老是提示端口已占用-CSDN社区 原…

端口被占用如何关闭

在开发的时候有些时候会发现端口冲突的问题&#xff0c;比如最常使用的8080端口为例&#xff1a; 那么如何查询那个进程使用该端口并进行关闭呢&#xff1f; 首先进入命令行窗口输入下方的命令查看所有的端口占用情况 >netstat -ano上面一步不是必须的&#xff0c;然后输入…

VMWare Workstation 443端口被占用

问题说明及检测&#xff1a; 今天安装svn的时候提示端口占用&#xff0c; cmd –>> netstat -aon | findstr “443” 查看到进程的pid为3312 ctrl shift esc 选择服务&#xff0c;查看到进程名&#xff08;点下PID可排序&#xff09; 这个问题是处在VMware上&…

443端口占用问题

起因 科学上网有问题 呗计算机积极拒绝了 俺也不晓得是啥问题&#xff0c;就先去排查了一些问题 下面是两个链接 给我很大帮助 cmd来查看和排出433是谁在占用 VMware占用443的解决路径 查看433占用 使用cmd netstat -ano|findstr “443” 得到如下结果 然后使用 tasklist|…

VMware占用443端口冲突的解决办法

http://www.pc6.com/infoview/Article_70640.html 今天安装了一个VMware Workstation&#xff0c;发现XAMPP的Apache就启动不了。看了一下错误日志&#xff0c;似乎是VMware Workstation占用了443端口导致冲突引起的。查看了一下&#xff0c;原来VMware Workstation有个共享虚拟…

window 服务器443端口占用,443和80端口被占用win10如何解决_443和80端口被占用win10怎么处理...

我们要知道&#xff0c;443端口即网页浏览端口&#xff0c;80端口为HTTP即超文本传输协议开放的&#xff0c;这是用来保护win10系统的正常运行&#xff0c;但是病毒也能通过端口进入系统&#xff0c;最近有用户发现win10系统443和80端口被占用了&#xff0c;对此&#xff0c;小…

成功解决:443端口被vmware-host(8992)占用。请关掉占用443端口的程序或者尝试使用系统代理模式

前言 在启动一个应用程序的时候&#xff0c;显示端口被占用。有两种解决思路&#xff1a;第一修改程序的端口。第二&#xff0c;关闭已经打开的端口。其它方式暂未想到 解决方法 这里采用关闭已经打开的程序占用的端口 1、鼠标在底部状态栏右键&#xff0c;在弹出框中选择 …

一种解决常见的80/443端口被占用导致steamcommunity 302服务无法启动的方法

如题&#xff0c;详见羽翼城大佬的博客&#xff0c;其中详细分析了此问题。奈何本人频繁遇到此问题&#xff0c;而每次打开任务管理器寻找占用此端口的进程时&#xff0c;发现占用443/80端口的进程就是302程序本身&#xff0c;结束进程后重启系统也无法解决。以下是原文给出的解…

HTTPS端口443被程序vmware-hostd.exe占用的解决

环境 Windows Version: Windows 8.1 Pro 64-bit XAMPP Version: 7.3.27 Control Panel Version: 3.2.4 [ Compiled: Jun 5th 2019 ] VMware Workstation 15 Pro 现象 安装完XAMPP并启动控制面板看到如下提示&#xff1a; Port 443 in use by ""C:\Program Files…

Apache--关于443端口被占用的解决方法

安装Apache后&#xff0c;但是在启动的过程中&#xff0c;遇到443端口被占用&#xff0c;网上看了一些解决方法&#xff0c;都没有解决问题。 执行启动命令httpd -k start (出现443 端口被占用的情况) 自己查看了端口&#xff0c;netstat -aon|findstr "443" 然后查…

解决443/80端口被占用情况

查找占用端口软件 两种方法 第一种 查看当前进程连接情况&#xff1a;netstat -ano 找到占用443或者80端口的软件&#xff0c;我这已经被我杀掉了&#xff0c;所以没有&#xff0c;就只是举个例子。介绍下方法。 通过找到的进程号&#xff0c;然后就可以到任务管理器里面结…

steam++加速问题:出现显示443端口被 vmware-hostd(9860)占用的错误。

前言 时不可以苟遇&#xff0c;道不可以虚行。 今天的的前言诗句特地百度搜索了一下&#xff0c;诗句大概的意思是&#xff1a;时机是不可能随便就能遇到的&#xff0c;道路也要一步一步踏实地行走&#xff0c;象征着好运的诗句&#xff0c;之所以特地去找这样意思的诗句&#…

443端口被占用

443端口被占用 解决方案1&#xff1a; cmd命令窗口---netstat -ano # 查看所有已经在运行的端口 找到443端口 查看PID 如上图所示: ​ 使用命令 例如: taskkill /f /pid 5600 ​ 如果如下图所示依旧无法停止端口运行请尝试第二种方案 解决方案二 可以通过邮件计算机--管…

查询解决443端口占用

一、写在开头 使用Steamcommunity_302&#xff0c;启动服务时提示443/80端口占用&#xff0c;应用程序里看了一圈没发现问题&#xff0c;只好使用命令行查看哪个程序占用&#xff0c;原来是vmware-hostd程序占用了443端口 。vmware-hostd.exe程序是Vmware用于虚拟机共享和远程…

关于Windows 443端口被占用问题的解决

1、打开 cmd 命令行窗口&#xff0c;输入netstat -ano 回车&#xff0c;如图&#xff1a; 图中可以看到某程序正在占用 443 端口&#xff08;左边一列 0.0.0.0:443&#xff0c;0.0.0.0 代表的地址也就是本地&#xff0c;冒号后面的443就是占用的端口&#xff09;&#xff0c;…