Guava-Collections2源码解析

2023-05-16

构造器

private Collections2() {

}

私有构造器,也没有静态构造器,所以可以很明确它是一个纯工具类了。


 

功能方法

filter过滤方法

传入一个带过滤的容器,和一个实现过滤规则的函数类,返回一个带有过滤动作的容器

public static <E> Collection<E> filter(Collection<E> unfiltered, Predicate<? super E> predicate) {

    return unfiltered instanceof Collections2.FilteredCollection?((Collections2.FilteredCollection)unfiltered).createCombined(predicate):new Collections2.FilteredCollection((Collection)Preconditions.checkNotNull(unfiltered), (Predicate)Preconditions.checkNotNull(predicate));

}

如果集成了Collections2.FilteredCollection类,则直接转型到Collections2.FilteredCollection,然后返回这个类。如果不是Collections2.FilteredCollection,则new一个,将传入的容器和规则传入。

看一下Collections2.FilteredCollection类的源码

static class FilteredCollection<E> extends AbstractCollection<E> {

    //存储待处理的集合

    final Collection<E> unfiltered;

    //存储过滤规则

    final Predicate<? super E> predicate;

  

    FilteredCollection(Collection<E> unfiltered, Predicate<? super E> predicate) {

        this.unfiltered = unfiltered;

        this.predicate = predicate;

    }

    //根据新的过滤规则和原来的过滤规则合并创建一个新的容器

    Collections2.FilteredCollection<E> createCombined(Predicate<? super E> newPredicate) {

        return new Collections2.FilteredCollection(this.unfiltered, Predicates.and(this.predicate, newPredicate));

    }

    //添加元素方法

    public boolean add(E element) {

        //根据过滤规则进行测试是否符合,如果符合便进行添加

        Preconditions.checkArgument(this.predicate.apply(element));

        return this.unfiltered.add(element);

    }

    //添加一个容器中所有元素

    public boolean addAll(Collection<? extends E> collection) {

        Iterator i$ = collection.iterator();

        //遍历容器,并对每一个容器进行塞选操作

        while(i$.hasNext()) {

            Object element = i$.next();

            Preconditions.checkArgument(this.predicate.apply(element));

        }

        //如果都满足就添加

        return this.unfiltered.addAll(collection);

    }

  

    public Iterator<E> iterator() {

        return Iterators.filter(this.unfiltered.iterator(), this.predicate);

    }

  

    public int size() {

        return Iterators.size(this.iterator());

    }

}


转型方法

传入一个转型的类,在传入一个转型规则

public static <F, T> Collection<T> transform(Collection<F> fromCollection, Function<? super F, T> function) {

    return new Collections2.TransformedCollection(fromCollection, function);

}

看以上代码,可以看到,直接创建了一个Collections2.TransformedCollection类。

static class TransformedCollection<F, T> extends AbstractCollection<T> {

    //需要转型的容器

    final Collection<F> fromCollection;

    //转型规则

    final Function<? super F, ? extends T> function;

    TransformedCollection(Collection<F> fromCollection, Function<? super F, ? extends T> function) {

        this.fromCollection = (Collection)Preconditions.checkNotNull(fromCollection);

        this.function = (Function)Preconditions.checkNotNull(function);

    }

    public void clear() {

        this.fromCollection.clear();

    }

    public boolean isEmpty() {

        return this.fromCollection.isEmpty();

    }

    //根据转型规则进行迭代

    public Iterator<T> iterator() {

        return Iterators.transform(this.fromCollection.iterator(), this.function);

    }

    public int size() {

        return this.fromCollection.size();

    }

}


有序排列方法

有序排列有两种方法:

//第一种是调用了第二种

public static <E extends Comparable<? super E>> Collection<List<E>> orderedPermutations(Iterable<E> elements) {

    return orderedPermutations(elements, Ordering.natural());

}

//第二种直接创建了Collections2.OrderedPermutationCollection类

public static <E> Collection<List<E>> orderedPermutations(Iterable<E> elements, Comparator<? super E> comparator) {

    return new Collections2.OrderedPermutationCollection(elements, comparator);

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Guava-Collections2源码解析 的相关文章

随机推荐

  • IMU预积分及残差雅克比计算

    前段时间推了泡泡机器人邱笑晨博士的IMU预积分公式 收获很大 再看到VIORB的时候 大都用的这一套公式 后再看VINS的时候 VINS用的是连续时间的预积分 看一些大佬的博客 说代码里写的是离散时间的 这里将所看到的做一下整理 要求的是
  • PyUIC报错Error: one input ui-file must be specified

    利用PyUIC将 ui转为 py报错 xff1a Error one input ui file must be specified 解决办法 xff1a 找到file gt setting gt tools gt Extenal Tool
  • 提取指定字符串后面的值----Python正则表达式

    例如 xff1a 从log文件中解析出shippingSn的值 span class token keyword import span re str1 span class token operator 61 span span clas
  • Python3离线安装requests模块

    requests模块的依赖包检查 在可以上网且已安装python的机器上检查requests模块需要哪些依赖包 xff0c 要是没有依赖包 xff0c 直接下载一个直接安装最好 在CMD命令窗口中输入 pip show requests 发
  • 树莓派zero w 安装python3.6

    在树莓派Raspbian系统上安装 conda 环境 但是 xff0c 在安装使用了一段时间后 xff0c 发现使用 Miniconda 的 armv7l 版本 xff0c python 只有 3 4 的版本 xff0c 而且比如安装 ip
  • 树莓派编译安装opencv出错:fatal error:boostdesc_bgm.i: No such file or directory

    opencv contrib modules xfeatures2d src boostdesc cpp 673 20 fatal error boostdesc bgm i No such file or directory 解决方式 x
  • 【PTC Thingworx(一)】申请30天免费试用

    1 进入Thingworx网站https developer thingworx com 2 选择Free Trials 3 完善信息申请30天试用 4 申请成功界面 5 点击Start Server开始服务 xff0c 并点击Launch
  • 树莓派Buster系统快速安装opencv(二)

    完成上一篇树莓派Buster系统编译安装opencv 一 xff09 中的配置wifi 换源 修改树莓默认Python版本 安装工具包等内容后 xff0c 开始本教程内容 1 下载opencv安装包 从https www piwheels
  • monkeyDev使用及初次使用问题的解决方法

    安装 1 下载monkeyDev git clone https github com AloneMonkey MonkeyDev git 2 进入bin文件夹执行安装命令 cd MonkeyDev bin sudo md install
  • node-red mysql节点报错“Pool is Closed”

    进入nodejs安装目录 执行以下命令 npm install mysql 重启node red pm2 restart all 问题解决
  • Windows搭建TensorFlow GPU环境

    一 CUDA安装 CUDA xff08 Compute Unified Device Architecture xff09 xff0c 是显卡厂商NVIDIA推出的运算平台 CUDA 是一种由NVIDIA推出的通用并行计算架构 xff0c
  • FTP下载报错:550 Failed to open file

    Filezilla报错 xff1a 550 Failed to open file xff0c 如下图 原因 xff1a 上传文件权限问题 解决办法 xff1a 修改vsftpd conf的虚拟用户权限配置 cd span class to
  • kubeadm flannel 网络问题

    环境 xff1a 节点 1 xff1a 192 168 60 100 节点 2 xff1a 192 168 60 101 节点 3 xff1a 192 168 60 102 虚拟机自建了一套kubeadm集群 xff0c 刚开始好好的 xf
  • Win10下安装opendr

    踩坑过程 xff1a 正常pip install opendr 报错 xff1a 下载Cython失败 解决 xff1a 去PYPI上找轮子 xff0c 离线安装Cython 问题 xff1a 这次库都下载好了 xff0c 但是安装时报错
  • Ubuntu18.04安装OpenCV4.2.0(不包含Python)

    之前写的项目安装教程节选Opencv部分 当时用的英文 有时间我再转中文 Install dependant envs span class token function sudo span span class token functio
  • Ubuntu18.04设置开机自启脚本

    网上参考Ubuntu18 04 开机自启动脚本之后并没成功 xff0c 各种搜索后发现博文内容都一样 xff0c 说什么亲测可行 xff0c 但根本没解决下面这个问题 span class token function sudo span
  • Linux 网卡VLAN、BOND配置

    此篇是在转载博文上做修订 原文内容有些地方不妥当 Redhat Linux的网络配置 xff0c 基本上是通过修改几个配置文件来实现的 xff0c 虽然也可以用ifconfig来设置IP xff0c 用route来配置默认网关 xff0c
  • WinSCP之Windows与Windows之间传输文件

    WinSCP之Windows与Windows之间传输文件 方法 xff1a WinSCP 43 OpenSSH xff08 1 xff09 在需要远程访问的windows电脑上安装OpenSSH的server xff1a 具体步骤如下 xf
  • C++类和对象——继承

    目录 1 继承的基本语法 2 继承方式 3 继承中的对象模型 4 继承中构造和析构顺序 5 继承同名成员处理方式 6 继承同名静态成员处理方式 7 多继承语法 8 菱形继承 继承是面向对象三大特性之一 有些类与类之间存在特殊的关系 xff0
  • Guava-Collections2源码解析

    构造器 private Collections2 私有构造器 xff0c 也没有静态构造器 xff0c 所以可以很明确它是一个纯工具类了 功能方法 filter过滤方法 传入一个带过滤的容器 xff0c 和一个实现过滤规则的函数类 xff0