文章目录

  • 概念
  • 基本使用
  • 实际业务使用(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…