首页 > 其他分享 >Map.Entry详解及List的流Stream

Map.Entry详解及List的流Stream

时间:2022-10-11 20:13:41浏览次数:82  
标签:UserPo Map Stream map list List key Entry

Map.Entry详解

Map是java中的接口,Map.Entry是Map的一个内部接口。
Map提供了一些常用方法,如keySet()、entrySet()等方法。
keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。
Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue方法。

Map<String, String> map = new HashMap<String, String>();    
  map.put("key1", "value1");    
  map.put("key2", "value2");    
  map.put("key3", "value3");    
      
  //第一种:普遍使用,二次取值    
  System.out.println("通过Map.keySet遍历key和value:");    
  for (String key : map.keySet()) {    
   System.out.println("key= "+ key + " and value= " + map.get(key));    
  }    
      
  //第二种    
  System.out.println("通过Map.entrySet使用iterator遍历key和value:");    
  Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();    
  while (it.hasNext()) {    
   Map.Entry<String, String> entry = it.next();    
   System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());    
  }    
      
 //第三种:推荐,尤其是容量大时</span>    
  System.out.println("通过Map.entrySet遍历key和value");    
  for (Map.Entry<String, String> entry : map.entrySet()) {    
   System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());    
  }    
    
  //第四种    
  System.out.println("通过Map.values()遍历所有的value,但不能遍历key");    
  for (String v : map.values()) {    
   System.out.println("value= " + v);    
  }

流Stream

@Data
class UserPo {
    private String name;
    private Integer score;

    public UserPo(String name, Integer score) {
        this.name = name;
        this.score = score;
    }
    public UserPo(String name) {
        this.name = name;
    }
}

public class DateTest{
    public static void main(String[] args) {
        UserPo userPo1 = new UserPo("zhangsan",12);
        UserPo userPo2 = new UserPo("lisi",21);
        UserPo userPo3 = new UserPo("wangwu",43);
        UserPo userPo4 = new UserPo("wangwu111",null);

        /**
         * filter
         * filter:过滤,就是过滤器,符合条件的通过,不符合条件的过滤掉
         * 筛选出成绩不为空的学生人数
         */
        ArrayList<UserPo> list= new ArrayList<>(Arrays.asList(userPo1,userPo2,userPo3));
        long count = list.stream().filter(p -> null != p.getScore()).count();

        /**
         * map:映射,他将原集合映射成为新的集合,在VO、PO处理的过程中较常见。
         * 在本例子中,原集合就是PO集合,新集合可以自定义映射为成绩集合,同时也可以对新集合进行相关操作。
         * 取出所有学生的成绩
         */
        List<Integer> scoreList = list.stream().map(p -> p.getScore()).collect(Collectors.toList());
        // 将学生姓名集合串成字符串,用逗号分隔
        String nameString = list.stream().map(p -> p.getName()).collect(Collectors.joining(","));

        /**
         * sorted:排序,可以根据指定的字段进行排序
         */
        // 按学生成绩逆序排序 正序则不需要加.reversed()
        List<UserPo>  filterList = list.stream().filter(p -> null != p.getScore()).sorted(Comparator.comparing(UserPo::getScore).reversed()).collect(Collectors.toList());

        /**
         * forEach
         * forEach:这个应该是最常用的,也就是为每一个元素进行自定义操作
         * 除了forEach操作会改变原集合的数据,其他的操作均不会改变原集合,这点务必引起注意
         */
        // 学生成绩太差了,及格率太低,给每个学生加10分,放个水
        filterList.stream().forEach(p -> p.setScore(p.getScore() + 10));

        /**
         * collect:聚合,可以用于GroudBy按指定字段分类,也可以用于返回列表或者拼凑字符串
         */
        // 按成绩进行归集
        Map<Integer, List<UserPo>> groupByScoreMap = list.stream().filter(p -> null != p.getScore()).collect(Collectors.groupingBy(UserPo::getScore));
        for (Map.Entry<Integer, List<UserPo>> entry : groupByScoreMap.entrySet()) {
            System.out.println("成绩:" + entry.getKey() + " 人数:" + entry.getValue().size());
        }
        // 返回list
        List<Integer> newScoreList = list.stream().map(p -> p.getScore()).collect(Collectors.toList());
        // 返回string用逗号分隔
        String newNameString = list.stream().map(p -> p.getName()).collect(Collectors.joining(","));
    }
}

标签:UserPo,Map,Stream,map,list,List,key,Entry
From: https://www.cnblogs.com/weidaijie/p/16782210.html

相关文章

  • 【code基础】stream流简化数组的求最大值
    将集合或者数组转化为流,进行求最大值,排序,可以省去for循环,简化代码量Arrays.stream(res).max().getAsInt()可以得到res数组的最大值Arrays.stream(res).sorted().boxed(......
  • Java集合TreeMap红黑树一生只爱一次(三天彻底理解应用TreeMap)
    一、那么为什么需要树呢?仔细想一下TreeSet、TreeMap,为什么要用他们。HashSet速度快,TreeSet则方便排序。HashMap速度快,TreeMap方便排序。同时,在树中查找数据项的速度和在有......
  • HashMap实现原理及源码分析
    哈希表(hashtable)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出现......
  • OutputStream详解
    我们都知道流分为字节流和字符流 输出流又分:字节输出流,字符输出流 输入流又分:字节输入流,字符输入流/*在java中OutputStream表示字节输出流,可以将java程序中的数据写到......
  • CMakeLists.txt中打印所有变量
    一、打印可见变量及其值get_cmake_property(_variableNamesVARIABLES)foreach(_variableName${_variableNames})message(STATUS"${_variableName}=${${_variabl......
  • javabean、xml、json、map之间的相互转换
    javabean转map利用cglib的BeanMap类实现转换importorg.springframework.cglib.beans.BeanMap;/****@Title:beanToMap*@Description:javabean转map*@parambean*......
  • Mybatis通用Mapper(springboot环境下使用)
    ​​mapper3通用接口大全​​​:​​https://gitee.com/free/Mapper.git​​1、添加pom文件依赖<!--mapper--><dependency><groupId>tk.mybatis</groupId><artifact......
  • Stream流中的常用方法_forEach与Stream流中的常用方法_filter
    Stream流中的常用方法_forEach常用方法 流模型操作很丰富,这里介绍一些常用的API。这些方法可以被分成两种延迟方法∶返回值类型仍然是stream接口自身类型的方法,因此......
  • ConcurrentHashMap底层原理
    5.6ConcurrentHashMap底层原理5.6.1jdk1.75.6.1.1数组结构数据结构是数组+segment对象,采用segment分段锁和CAS保证并发。5.6.1.2put操作流程/***Co......
  • Flink DataStream Sink(四)
    FlinkDataStreamSink(四)文档:https://bahir.apache.org/docs/flink/current/flink-streaming-redis/https://nightlies.apache.org/flink/flink-docs-release-1.......