怎么在java 8的map中使用stream

简介: 怎么在java 8的map中使用stream

怎么在java 8的map中使用stream


简介


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

相关文章
|
20天前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
198 92
|
20天前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
140 68
|
2月前
|
Oracle Java 关系型数据库
掌握Java Stream API:高效集合处理的利器
掌握Java Stream API:高效集合处理的利器
329 80
|
2月前
|
安全 Java API
Java 8 Stream API:高效集合处理的利器
Java 8 Stream API:高效集合处理的利器
221 83
|
3月前
|
SQL JSON 安全
Java 8 + 中 Lambda 表达式与 Stream API 的应用解析
摘要:本文介绍了Java 8+核心新特性,包括Lambda表达式与Stream API的集合操作(如过滤统计)、函数式接口的自定义实现、Optional类的空值安全处理、接口默认方法与静态方法的扩展能力,以及Java 9模块化系统的组件管理。每个特性均配有典型应用场景和代码示例,如使用Stream统计字符串长度、Optional处理Map取值、模块化项目的依赖声明等,帮助开发者掌握现代Java的高效编程范式。(150字)
61 1
|
3月前
|
存储 Java 大数据
Java代码优化:for、foreach、stream使用法则与性能比较
总结起来,for、foreach和stream各自都有其适用性和优势,在面对不同的情况时,有意识的选择更合适的工具,能帮助我们更好的解决问题。记住,没有哪个方法在所有情况下都是最优的,关键在于理解它们各自的特性和适用场景。
368 23
|
2月前
|
SQL 人工智能 Rust
Java 开发中Stream的toMap与Map 使用技巧
本文深入解析了 Java 中 `toMap()` 方法的三大问题:重复键抛出异常、`null` 值带来的风险以及并行流中的性能陷阱,并提供了多种替代方案,如使用 `groupingBy`、`toConcurrentMap` 及自定义收集器,帮助开发者更安全高效地进行数据处理。
148 0
|
4月前
|
安全 Java API
【Java性能优化】Map.merge()方法:告别繁琐判空,3行代码搞定统计累加!
在日常开发中,我们经常需要对Map中的值进行累加统计。}else{代码冗长,重复调用get()方法需要显式处理null值非原子操作,多线程下不安全今天要介绍的方法,可以让你用一行代码优雅解决所有这些问题!方法的基本用法和优势与传统写法的对比分析多线程安全版本的实现Stream API的终极优化方案底层实现原理和性能优化建议一句话总结是Java 8为我们提供的Map操作利器,能让你的统计代码更简洁、更安全、更高效!// 合并两个列表});简单累加。
398 0
|
9月前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
271 6
|
9月前
|
Java API 开发者
Java中的Lambda表达式与Stream API的协同作用
在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。

热门文章

最新文章