如何在java 8 map中使用stream

所属分类: 软件编程 / java 阅读数: 81
收藏 0 赞 0 分享

简介

Map是java中非常常用的一个集合类型,我们通常也需要去遍历Map去获取某些值,java 8引入了Stream的概念,那么我们怎么在Map中使用Stream呢?

基本概念

Map有key,value还有表示key,value整体的Entry。

创建一个Map:

Map<String, String> someMap = new HashMap<>();

获取Map的entrySet:

Set<Map.Entry<String, String>> entries = someMap.entrySet();

获取map的key:

Set<String> keySet = someMap.keySet();

获取map的value:

Collection<String> values = someMap.values();

上面我们可以看到有这样几个集合:Map,Set,Collection。

除了Map没有stream,其他两个都有stream方法:

Stream<Map.Entry<String, String>> entriesStream = entries.stream();
Stream<String> valuesStream = values.stream();
Stream<String> keysStream = keySet.stream();

我们可以通过其他几个stream来遍历map。

使用Stream获取map的key

我们先给map添加几个值:

someMap.put("jack","20");
someMap.put("bill","35");

上面我们添加了name和age字段。

如果我们想查找age=20的key,则可以这样做:

Optional<String> optionalName = someMap.entrySet().stream()
        .filter(e -> "20".equals(e.getValue()))
        .map(Map.Entry::getKey)
        .findFirst();
    log.info(optionalName.get());

因为返回的是Optional,如果值不存在的情况下,我们也可以处理:

optionalName = someMap.entrySet().stream()
        .filter(e -> "Non ages".equals(e.getValue()))
        .map(Map.Entry::getKey).findFirst();

    log.info("{}",optionalName.isPresent());

上面的例子我们通过调用isPresent来判断age是否存在。

如果有多个值,我们可以这样写:

someMap.put("alice","20");
    List<String> listnames = someMap.entrySet().stream()
        .filter(e -> e.getValue().equals("20"))
        .map(Map.Entry::getKey)
        .collect(Collectors.toList());

    log.info("{}",listnames);

上面我们调用了collect(Collectors.toList())将值转成了List。

使用stream获取map的value

上面我们获取的map的key,同样的我们也可以获取map的value:

List<String> listAges = someMap.entrySet().stream()
        .filter(e -> e.getKey().equals("alice"))
        .map(Map.Entry::getValue)
        .collect(Collectors.toList());

    log.info("{}",listAges);

上面我们匹配了key值是alice的value。

总结

Stream是一个非常强大的功能,通过和map相结合,我们可以更加简单的操作map对象。

本文的例子https://github.com/ddean2009/learn-java-streams/tree/master/stream-formap

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Java基于反射机制实现全部注解获取的方法示例

这篇文章主要介绍了Java基于反射机制实现全部注解获取的方法,结合实例形式分析了java反射机制获取注解的具体实现方法与操作注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

Java 信号量Semaphore的实现

这篇文章主要介绍了Java 信号量Semaphore的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

eclipse+maven+spring mvc项目基本搭建过程

这篇文章主要介绍了eclipse+maven+spring mvc项目基本搭建过程,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Spring boot集成swagger2生成接口文档的全过程

这篇文章主要给大家介绍了关于Spring boot集成swagger2生成接口文档的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享

Java冒泡排序法和选择排序法的实现

这篇文章主要介绍了Java冒泡排序法和选择排序法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Spring Cloud Alibaba教程之Sentinel的使用

这篇文章主要介绍了Spring Cloud Alibaba教程之Sentinel的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Josephus环的四种解法(约瑟夫环)基于java详解

这篇文章主要介绍了Josephus环的四种解法(约瑟夫环)基于java详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Java继承Thread类创建线程类示例

这篇文章主要介绍了Java继承Thread类创建线程类,结合实例形式分析了java线程操作相关使用技巧与注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

Java使用Callable和Future创建线程操作示例

这篇文章主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

springBoot使用JdbcTemplate代码实例

这篇文章主要介绍了springBoot使用JdbcTemplate代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多