遍历List和Map的几种方法
总结一下list和map遍历的几种方式
一、遍历list的几种方法实现
1 import java.util.ArrayList; 2 import java.util.Iterator; 3 import java.util.List; 4 import java.util.function.Consumer; 5 6 public class ForTest { 7 public static void main(String[] args) { 8 List<String> list = new ArrayList<String>() {{ 9 add("abc"); 10 add("def"); 11 add("igh"); 12 }}; 13 14 15 System.out.println("----------方式1:普通for循环-----------"); 16 for (int i = 0; i < list.size(); i++) { 17 System.out.println(list.get(i)); 18 } 19 20 System.out.println("----------方式2.1:使用迭代器-----------"); 21 for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) { 22 System.out.println(iterator.next()); 23 } 24 25 System.out.println("----------方式2.2:使用迭代器-----------"); 26 Iterator<String> iterator = list.iterator(); 27 while(iterator.hasNext()){ 28 System.out.println(iterator.next()); 29 } 30 31 System.out.println("----------方式3:For-Each 循环-----------"); 32 for (String str : list) { 33 System.out.println(str); 34 } 35 36 System.out.println("----------方式4.1:Lambda表达式 (java8之后)-----------"); 37 list.forEach(str->System.out.println(str)); 38 39 40 System.out.println("----------方式4.2:关于Lambda表达式的自定义 (java8之后)-----------"); 41 //创建自定义消费行为动作实例 42 MyConsumer myConsumer = new MyConsumer(); 43 list.forEach(myConsumer); 44 } 45 46 47 static class MyConsumer implements Consumer<Object> { 48 49 @Override 50 public void accept(Object t) { 51 System.out.println("打印输出(动作执行的参数):" + t); 52 } 53 } 54 }
二、Java8中的foreach方法
1、forEach源码
forEach方法是JAVA8中在集合父接口java.lang.Iterable中新增的一个default实现方法:
- forEach方法接受一个在JAVA8中新增的java.util.function.Consumer的消费行为 或者称之为动作 (Consumer action )类型;
- 然后将集合中的每个元素作为消费行为的accept方法的参数执行;
- 直到每个元素都处理完毕或者抛出异常即终止行为;
- 除非指定了消费行为action 的实现,否则默认情况下是按迭代里面的元素顺序依次处理。
2、自定义消费行为
1 static class MyConsumer implements Consumer<Object> { 2 3 @Override 4 public void accept(Object t) { 5 System.out.println("打印输出(动作执行的参数):" + t); 6 } 7 }
- 首先,需要实现java.util.function.Consumer接口;
- 再次,实现其accept方法
3、相关API
- java.lang.Iterable#forEach
- java.util.function.Consumer#accept
三、遍历map几种方法实现(重点:第三种方法)
Map提供了一些常用方法,如keySet()、entrySet()等方法。
keySet()方法返回值是Map中key值的Set集合;entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。
关于Map.Entry:
Map是java中的接口,Map.Entry是Map的一个内部接口。
此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。接口中有getKey()/getValue()方法。
代码实现:
1 public class MapTest { 2 public static void main(String[] args) { 3 Map<String, Long> longestResult = new HashMap<>(); 4 longestResult.put("id", 0L); 5 System.out.println(longestResult.get("id")); 6 7 //根据key获取value时,如果map里没有相应的key,返回null 8 System.out.println(longestResult.get("name")); 9 10 printTest(); 11 } 12 13 private static void printTest() { 14 Map<String, String> map = new HashMap<String, String>(); 15 map.put("key1", "value1"); 16 map.put("key2", "value2"); 17 map.put("key3", "value3"); 18 19 //第一种:普遍使用,二次取值 20 System.out.println("通过Map.keySet遍历key和value:"); 21 for (String key : map.keySet()) { 22 System.out.println("key= "+ key + " and value= " + map.get(key)); 23 } 24 25 //第二种 26 System.out.println("通过Map.entrySet使用iterator遍历key和value:"); 27 Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); 28 while (it.hasNext()) { 29 Map.Entry<String, String> entry = it.next(); 30 System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); 31 } 32 33 //第三种:推荐,尤其是容量大时 34 System.out.println("通过Map.entrySet遍历key和value"); 35 for (Map.Entry<String, String> entry : map.entrySet()) { 36 System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); 37 } 38 39 //第四种 40 System.out.println("通过Map.values()遍历所有的value,但不能遍历key"); 41 for (String value : map.values()) { 42 System.out.println("value= " + value); 43 } 44 } 45 46 }