集合四——Map

Map——映射,用来存放键值对。
Java类库停供了两个通用的实现:HashMap和TreeMap。
HashMap——散列映射,对键进行散列,TreeMap——树映射,用键的整体顺序对元素进行比较,并将其组织成搜索树。散列或比较函数只能用于键。与键关联的值不能进行散列或比较。
注意:TreeMap是有序的类似TreeSet,TreeMap的键元素必须是可比较的。要么键元素实现Comparable接口,要么在创建Map时指定一个比较器(可参照集合三——Set)。
在选择树和散列映射上,与集一样,散列快点,如果不需要排序就最好选择散列。

Map

V get(Object key)
获取与键对应的值:如果不存在这个值就返回null。键值可以为null。
default V getOrdefault(Object key,V defaultValue)
获得与键关联的值:如果不存在则返回defaultValue
V put()
default void forEach(BiConsumer<? super K,? super V> action)
对这个映射中的所有键值対应用这个动作。
用这个方法可以很轻松遍历映射;

map.forEach((k,v)->System.out.print(k+":"+v);

TreeMap和HashMap都实现了Map类。并且TreeMap和HashMap的基本操作和Set类似可以参照集合三——Set
接下来主要是更新映射项和映射视图。

更新映射项

映射更新有一个难点。就是如果这个键是第一次出现,在更新时会遇到问题。
比如说我要统计某些东西的数量,不可能先把所有键都放进映射里并设置值为一吧,这样太麻烦了,万一自己也不知道有哪些键那就更麻烦了。
这里写三个常用的方法。

map.put(something,map.getOrDefault(something,0)+1);
map.putIfAbsent(sosmething,0);
mqp.put(something,map.get(something)+1);
map.merge(something,1,Integer::sum);

putIfAbsent方法,如果不存在键对应的值就把值设为0,如果存在键对应的值则不做反应。
merge(K key,V value,一个函数)方法,如果key与一个非null值v关联,将函数应用到v和value,将key与结果关联,或者如果结果为null,这删除这个键。否则将key与value关联,返回get(key)。

映射视图

集合框架不认为映射本身是一个集合。不过可以得到映射的视图——实现了Collection接口或摸个子接口的对象。
有三种视图,都可以同方法获得;
键集: Set keySet()
值集合:collection values()
键/值対集:Set<Map.Entry<K,V>> entrySet()
三种视图都可以进行集合操作。
如遍历一个映射的所有键。

Set<Striing> keys=map.keySet();
for(String k:keys){
	........
}

在映射的视图中的删除操作会影响到对应的映射,但不能对映射视图添加元素即调用add()方法,不然会报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 8中新增的Stream是一种处理集合的优雅姿势。 Stream是对集合(Collection)对象功能的增强,它能以一种声明的方式来处理数据,实现类似于SQL语句的操作。Stream不会改变原有的数据结构,它会生成一个新的Stream,同时支持并行化操作。 Stream的核心思想是将数据看作是流,而流上可以进行各种操作,比如过滤、排序、映射等。这样可以将数据处理过程变得非常简洁和灵活。 下面是一些Stream的常用操作: 1. filter:过滤符合条件的元素 ``` List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); list.stream().filter(i -> i % 2 == 0).forEach(System.out::println); //输出2, 4 ``` 2. map:将元素转换成另一种类型 ``` List<String> list = Arrays.asList("apple", "banana", "orange"); list.stream().map(s -> s.toUpperCase()).forEach(System.out::println); //输出APPLE, BANANA, ORANGE ``` 3. sorted:对元素进行排序 ``` List<Integer> list = Arrays.asList(5, 2, 1, 4, 3); list.stream().sorted().forEach(System.out::println); //输出1, 2, 3, 4, 5 ``` 4. distinct:去重 ``` List<Integer> list = Arrays.asList(1, 2, 3, 2, 1); list.stream().distinct().forEach(System.out::println); //输出1, 2, 3 ``` 5. limit:限制元素个数 ``` List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); list.stream().limit(3).forEach(System.out::println); //输出1, 2, 3 ``` 6. skip:跳过元素 ``` List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); list.stream().skip(2).forEach(System.out::println); //输出3, 4, 5 ``` 7. reduce:对元素进行聚合操作 ``` List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); int sum = list.stream().reduce(0, (a, b) -> a + b); System.out.println(sum); //输出15 ``` Stream的操作可以组合起来形成一个流水线,每个操作都会返回一个新的Stream对象,这样就可以形成一个操作序列。最后调用终止操作(如forEach、findAny等)才会触发所有中间操作的执行。 使用Stream处理集合的代码通常比使用传统的循环更简洁,同时也更易于并行化处理,提高了程序的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值