一、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五种方法相关推荐

  1. List集合遍历的五种方法

    List集合遍历的五种方法: public static void main(String[] args) {List<Integer> list = Lists.newArrayList ...

  2. JavaScript 数组遍历的五种方法(转)

    转自:JavaScript 数组遍历的五种方法 这篇文章主要介绍了JavaScript 数组遍历的五种方法,帮助大家更好的理解和学习使用JavaScript,感兴趣的朋友可以了解下 在使用 JavaS ...

  3. 【224期】Java 字符串拼接五种方法的性能比较分析,从执行100次到90万次?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每天 08:15 更新文章,每天进步一点点... ...

  4. map集合遍历的五种方法

    package com.jackey.topic; import java.util.ArrayList; import java.util.HashMap; import java.util.Ite ...

  5. Java 中Map五种取值方式

    map的主要作用是什么? 可以通过创建一个map的实现类 来存放 数据 值 和值的描述 也可以通过描述去取得数据     将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.此接 ...

  6. HashMap遍历的五种方法

    在本文中,我们将通过示例讨论在 Java 上遍历 HashMap 的五种最佳方法. 1.使用 Iterator 遍历 HashMap EntrySet 2.使用 Iterator 遍历 HashMap ...

  7. Java 遍历Map集合的方法

    方法一:通过Map.keySet,遍历key和value Map<String, Object> map = new HashMap<>(); for (String key ...

  8. Map循环遍历的五种方法

    因为Map比较常用,所以今天来总结下Map取值比较常用的几种遍历方法. 1.创建一个Enum public enum FactoryStatus {BAD(0,"ou"),GOOD ...

  9. Map循环遍历的五种方法记录

    我们先初始化一个最简单的Map集合 Map<String, String> test = new HashMap<>();test.put("123", & ...

最新文章

  1. 深入剖析Vue源码 - 响应式系统构建(上)
  2. Java创建多线程的三种方法
  3. getline读取不等待输入的问题
  4. 2015-05-27 用正则把oracle时间转化到mysql时间
  5. java collections 用法_Java Collections unmodifiableCollection()用法及代码示例
  6. 教你如何用手机查看哪些人在蹭你家的WIFI,然后将他们屏蔽!
  7. (原创) 对饱和状态NPN晶体管内部机制的理解分析
  8. 【设计模式】—— 解释器模式Interpret
  9. 给wordpress添加留言者操作系统、浏览器和运营商信息
  10. 批处理打开URL总结
  11. 【python基础】猜数字游戏
  12. 记录解决nonebot2中定时器报时区问题的错误
  13. 安卓的用户实时预览Figma设计稿的方法
  14. 新一配:5G与4G的不同工作原理【转载】
  15. 【PyTorch深度学习项目实战100例】—— Python+OpenCV+MediaPipe手势识别系统 | 第2例
  16. 启动计算机引导win10,示例如何修复win10系统引导项
  17. 操作系统——时间片轮转调度算法(RR)
  18. 计算机原理与应用作业,计算机原理与应用(杨刚)-中国大学mooc-题库零氪
  19. 第三章:3.3 傅里叶级数收敛分析
  20. Baize_ServoDriver_esp8266-(arduino32路舵机驱动板)(开源可自制,附程序和固件以及烧录方法)

热门文章

  1. SPSS统计分析案例:无空白列重复正交试验设计方差分析
  2. 一个C#开发的Windows远程桌面工具
  3. 智能照明-----开关第二讲----随意贴
  4. 红帽linux 加固,RedHat 密码策略加固
  5. NET酒店宾馆客房管理系统源码
  6. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第45讲:PHP程序设计中的session技术
  7. 今天面了个京东拿 38K 出来的,让我见识到了基础的天花板
  8. PostgreSQL安全指南 - Postgres2015全国用户大会--重磅嘉宾佳作分享(周正中)
  9. mac看图软件哪个好用_办公记事软件哪个好?工作记事本便签app哪个好用
  10. 巧用10行python 代码让JMETER实现动态验证码登录