Java遍历Map五种方法
一、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);}
Java遍历Map五种方法相关推荐
- List集合遍历的五种方法
List集合遍历的五种方法: public static void main(String[] args) {List<Integer> list = Lists.newArrayList ...
- JavaScript 数组遍历的五种方法(转)
转自:JavaScript 数组遍历的五种方法 这篇文章主要介绍了JavaScript 数组遍历的五种方法,帮助大家更好的理解和学习使用JavaScript,感兴趣的朋友可以了解下 在使用 JavaS ...
- 【224期】Java 字符串拼接五种方法的性能比较分析,从执行100次到90万次?
点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每天 08:15 更新文章,每天进步一点点... ...
- map集合遍历的五种方法
package com.jackey.topic; import java.util.ArrayList; import java.util.HashMap; import java.util.Ite ...
- Java 中Map五种取值方式
map的主要作用是什么? 可以通过创建一个map的实现类 来存放 数据 值 和值的描述 也可以通过描述去取得数据 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.此接 ...
- HashMap遍历的五种方法
在本文中,我们将通过示例讨论在 Java 上遍历 HashMap 的五种最佳方法. 1.使用 Iterator 遍历 HashMap EntrySet 2.使用 Iterator 遍历 HashMap ...
- Java 遍历Map集合的方法
方法一:通过Map.keySet,遍历key和value Map<String, Object> map = new HashMap<>(); for (String key ...
- Map循环遍历的五种方法
因为Map比较常用,所以今天来总结下Map取值比较常用的几种遍历方法. 1.创建一个Enum public enum FactoryStatus {BAD(0,"ou"),GOOD ...
- Map循环遍历的五种方法记录
我们先初始化一个最简单的Map集合 Map<String, String> test = new HashMap<>();test.put("123", & ...
最新文章
- 深入剖析Vue源码 - 响应式系统构建(上)
- Java创建多线程的三种方法
- getline读取不等待输入的问题
- 2015-05-27 用正则把oracle时间转化到mysql时间
- java collections 用法_Java Collections unmodifiableCollection()用法及代码示例
- 教你如何用手机查看哪些人在蹭你家的WIFI,然后将他们屏蔽!
- (原创) 对饱和状态NPN晶体管内部机制的理解分析
- 【设计模式】—— 解释器模式Interpret
- 给wordpress添加留言者操作系统、浏览器和运营商信息
- 批处理打开URL总结
- 【python基础】猜数字游戏
- 记录解决nonebot2中定时器报时区问题的错误
- 安卓的用户实时预览Figma设计稿的方法
- 新一配:5G与4G的不同工作原理【转载】
- 【PyTorch深度学习项目实战100例】—— Python+OpenCV+MediaPipe手势识别系统 | 第2例
- 启动计算机引导win10,示例如何修复win10系统引导项
- 操作系统——时间片轮转调度算法(RR)
- 计算机原理与应用作业,计算机原理与应用(杨刚)-中国大学mooc-题库零氪
- 第三章:3.3 傅里叶级数收敛分析
- Baize_ServoDriver_esp8266-(arduino32路舵机驱动板)(开源可自制,附程序和固件以及烧录方法)
热门文章
- SPSS统计分析案例:无空白列重复正交试验设计方差分析
- 一个C#开发的Windows远程桌面工具
- 智能照明-----开关第二讲----随意贴
- 红帽linux 加固,RedHat 密码策略加固
- NET酒店宾馆客房管理系统源码
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第45讲:PHP程序设计中的session技术
- 今天面了个京东拿 38K 出来的,让我见识到了基础的天花板
- PostgreSQL安全指南 - Postgres2015全国用户大会--重磅嘉宾佳作分享(周正中)
- mac看图软件哪个好用_办公记事软件哪个好?工作记事本便签app哪个好用
- 巧用10行python 代码让JMETER实现动态验证码登录