文章目录
- 概念
- 基本使用
- 实际业务使用(Bug解决)
在最近的工作中有一个Bug的解决用到了Pair,之前还没用过Pair这个类,只是见过,这次顺便记录学习一下
概念
配对(Pair):它提供了一种方便方式来处理简单的键值关联,有两种场景可以使用:第一种使用场景比较简单,我这里主要讲下第二种,我的Bug解决也是说的第二种
1、当我们想从方法返回两个值时特别有用
2、当我们使用单个字段无法识别某个对象的唯一性,还需要加上一个字段辅助识别的情况下就可以使用Pair(下面会讲)
基本使用
这里我Pair使用的是common.lang3包下面的,因为common.lang3刚好也是我们项目中会引入的
假设一个场景:我们手机的品牌(Brand)有很多种,并且同一个品牌可能由多个不同的国家(Country)生产,那么对于比如苹果品牌Apple,它使用Pair则可以区别出不同的国家生产的
@Test
public void test() {
String phoneBrand = "Apple";
String country1 = "US";
String country2 = "Japan";
Pair pair = new ImmutablePair<>(phoneBrand, country1);
Pair pair2 = new ImmutablePair<>(phoneBrand, country2);
System.out.println(pair.toString());
System.out.println(pair2.toString());
}
输出如下
(Apple,US)
(Apple,Japan)
实际业务使用(Bug解决)
业务场景:这里我需要根据前端传参的phone实体类,进行分类,然后移除
当时我这个Bug并不是必现的,发现是跟前端的入参有关:
- 如果你传参的品牌不会重复,那就不会复现,
- 如果重复了,那就会有Bug,原因就是多个一样的品牌的话后面的会覆盖前面的!
public void removePhone() {
//---封装前端的入参Start---
RemovePhone removePhone1 = new RemovePhone();
removePhone1.setPrice(100);
removePhone1.setBrand("Apple");
removePhone1.setCountry("Japan");
RemovePhone removePhone2 = new RemovePhone();
removePhone2.setPrice(66);
removePhone2.setBrand("Apple");
removePhone2.setCountry("US");
List<RemovePhone> removePhoneList = Lists.newArrayList(removePhone1, removePhone2);
//---封装前端的入参End---
//模拟业务代码,这里假设我要将前端传过来的入参按照手机的品牌分类放到Map中
Map<String, RemovePhone> removePhoneMap = Maps.newHashMap();
removePhoneList.forEach(item -> removePhoneMap.put(item.getBrand(), item));
//模拟进行后续操作,会发现有一个前端的入参被覆盖了,导致移除失败
removePhoneMap.entrySet().forEach(entry -> System.out.println(entry));
}
@Data
private class RemovePhone {
private int price;
private String brand;
private String country;
}
输出
Apple=PairTest.RemovePhone(price=66, brand=Apple, country=US)
使用Pair来解决:我这里用Pair的思路来源是看到了项目中有其他地方使用Pair,后面想了想我这里对同个品牌,完全可以再加上一个国家字段来标识唯一性
Map<Pair<String, String>, RemovePhone> removePhoneMap2 = Maps.newHashMap();
removePhoneList.forEach(item -> removePhoneMap2.put(new ImmutablePair<>(item.getCountry(), item.getBrand()), item));
removePhoneMap2.entrySet().forEach(entry-> System.out.println(entry));
输出
(Japan,Apple)=PairTest.RemovePhone(price=100, brand=Apple, country=Japan)
(US,Apple)=PairTest.RemovePhone(price=66, brand=Apple, country=US)
这样就完美地解决了这个BUG…