媒体报道

欧陆娱乐|欧陆平台|中国农业交易【欧陆注册登录】

2022-10-12 12:59:09 yqs888 5

欧陆娱乐|欧陆平台|中国农业交易【欧陆注册登录】报道,集合操作是编程中使用频率非常高的,所有有一款针对集合的操作工具是非常有必要的。通过框架提供的工具一方面可以减少开发相似功能的耗时;同时框架在安全与稳定性上更被推荐。

Guava Collect是Guava工具包中的一个子模块,主要对jdk中的集合操作添加了一些简易的API,同时也是对Collections工具类的扩展。当然Guava还定义了一些特定场景的数据结构以及一些针对jdk集合的优化,最典型的就是Immutable Collections(不可变集合),你会发现调用Guava API很多都是不可变的

意义

我们常见的集合类有:

  • List

  • Set

  • Vector

  • Stack

  • Map

  • Queue

集合是一种非常常见的数据结构,JDK在处理各种数据集时,提供了以上集合类型的数据结构以及其对应API方便开发者高效简易地对数据对象操作

特色

guava主要提供了以下几个方面的支持:

  • 增加了不可变集合

    • 不受信任的库可以安全使用。

    • 线程安全:可以被许多线程使用,没有竞争条件的风险。

    • 不需要支持突变,并且可以通过该假设节省时间和空间。所有不可变集合实现都比它们的可变兄弟更节省内存。(分析)

    • 可以用作常数,期望它保持不变。

  • 增加了新的集合类型

    • Multiset 与普通的Set相比,提供了元素出现频率的记录。可用于元素出现次数的记录

    • Multimap 一个与Map相比,一个建可以对应对应多个值。与Spring中MultiValueMap一样

    • BiMap 键值都是唯一的Map

    • Table 具有行、列的表格,数据视图中可能更直观。

    • ClassToInstanceMap 键为Class,值为Class实例的特殊Map

    • RangeSet 代表一组数据区间,类似数学中的 [1,9)

    • RangeMap 与RangeSet类似,不过将其区间作为建,可以有自己的值。[1,9) -> 'VAL'

  • 优化了常用的操作

    • 集合的创建
      ImmutableSet.of(elem ...)Lists.newArrayList(elem ...)Sets.newHashSet(elem ...)Maps.newHashMap()...

    • 常用的操作 判断两个集合是否相等:Iterables.elementsEqual()
      集合分段处理:Lists.partition()取集合的交集:Sets.intersection()取集合的差集:Sets.difference()...

使用

Guava Collect作为集合操作工具,我们主要从实际业务中了解其能够帮助我们实现怎样的需求,下面看下其API的使用情况:

假设我们有10000名学生,通过Faker生成这些模拟的学生数据数据:

List<Student> students = new ArrayList<>();
Faker faker = new Faker(Locale.CHINA);@Beforepublic void init(){     Faker enFaker = new Faker();     Name name = faker.name();     IntStream.range(0,10000).forEach(index->{         students.add(         Student.of()         .setId(String.valueOf(index+1))         .setName(name.name())         .setAge(faker.number().numberBetween(18,22))         .setGender(new String[]{"男","女"}[faker.number().numberBetween(0,2)])         .setAddress(faker.address().streetAddress())         .setScore(faker.number().randomDouble(3,50,100))         .setEmail( faker.internet().emailAddress(enFaker.name().username()))         .setTelephone(faker.phoneNumber().cellPhone())         );     });
}

Multiset
获取元素出现频次。比如获取男生与女生的学生数量分别为多少

    @Test    public void multiset(){         Multiset multiset = HashMultiset.create();         students.forEach(student -> {            if(Objects.equals(student.getGender(),"男")){                multiset.add("男");             }else{                multiset.add("女");             }         });          System.out.println("学生中男生数量:"+ multiset.count("男"));         System.out.println("学生中女生数量:"+ multiset.count("女"));     }

Multimap
一个键对应多个值时。比如查看各个年龄的学生是哪些

    @Test    public void multimap(){         ListMultimap<Integer, Student> multimap =                 MultimapBuilder.hashKeys().arrayListValues().build();          students.forEach(student -> {            multimap.put(student.getAge(),student);         });          System.out.println( multimap.get(20) );     }

BiMap
键和值都是唯一时。比如处理学生的邮箱和手机号,客户互换键值位置

    @Test    public void biMap(){         BiMap biMap = HashBiMap.create();          students.forEach(student -> {             biMap.put(student.getEmail(),student.getTelephone());         });          BiMap inverse = biMap.inverse();// 键值更换          System.out.println( biMap );         System.out.println( inverse );     }

Table
二维表,通过行(键)、列(键)取值 比如可以以学生为行数据,其中id为行键,列名分别为学生属性名称

ID姓名年龄性别1TOM22男

    @Test     public void table(){         Table<String, String, Object> weightedGraph = HashBasedTable.create();         students.forEach(student -> {             weightedGraph.put(student.getId(), "姓名", student.getName());             weightedGraph.put(student.getId(), "年龄", student.getAge());             weightedGraph.put(student.getId(), "性别", student.getGender());             weightedGraph.put(student.getId(), "邮箱", student.getEmail());             weightedGraph.put(student.getId(), "电话", student.getTelephone());             weightedGraph.put(student.getId(), "地址", student.getAddress());             weightedGraph.put(student.getId(), "分数", student.getScore());         });        Map<String, Object> row = weightedGraph.row("1");        Map<String, Object> column = weightedGraph.column("姓名");        Set<Table.Cell<String, String, Object>> cells = weightedGraph.cellSet();          System.out.println( row );         System.out.println( column );         System.out.println( cells );     }

ClassToInstanceMap
当值是键的类型实例时,通过该Map现在键值关系