guava笔记1-Optional,Preconditions,Ordering,Objects,ComparisonChain,Throwables

 (1)Optional  标识可以为空的对象。
   static <T> Optional<T> absent() 返回事实上的空对象。
   static <T> Optional<T> of(T reference) 构造一个Optional对象。注意T不能为null,否则将抛异常。
   static <T> Iterable<T> presentInstances(Iterable<? extends Optional<? extends T>> optionals) 从一个Iterable构造另一个Iterable,除去空对象(isPresent()=true)

   abstract boolean isPresent() 返回是否为空。
   abstract T get() 返回存储的对象。
   abstract Set<T> asSet() 返回一个集合,仅包含存储的对象一个元素,如果为空的话就是空集合。
   abstract Optional<T>    or(Optional<? extends T> secondChoice)返回对象,如果为空就返回secondChoice。
   abstract T or(Supplier<? extends T> supplier) 返回对象,如果为空就返回supplier.get()返回的对象;Supplier是个很简单的接口,只有get()一个方法;这样的话各种实现该接口的对象都可以提供Optional的默认值。
   abstract T or(T defaultValue)返回对象,为空则返回defaultValue
   abstract T orNull() 返回对象,为空则返回null
   abstract <V> Optional<V> transform(Function<? super T,V> function) 将Optional对象转化为V对象
  
   equals,hashcode,tostring就不说了。

 (2)Preconditions 断言, 这个用的比较多。一般用于校验方法传入的参数是否满足心理预期。
  checkArgument(i >= 0, "Argument was %s but expected nonnegative", i);
  checkArgument(i < j, "Expected i < j, but %s > %s", i, j);

  主要的方法有:
  checkArgument(boolean)
  checkNotNull(T)
  checkState(boolean)
  checkElementIndex(int index, int size)
  checkPositionIndex(int index, int size)
  checkPositionIndexes(int start, int end, int size)

  (3)Ordering 对集合进行排序,是guava对comparators的优化,实现了接口Comparator<T>,支持标准的链式操作。
static Ordering<Object>    allEqual()  返回的排序策略认为所有对象都是相等的,包括null。
Ordering.allEqual().nullsLast().sortedCopy(asList(t, null, e, s, null, t, null)) 将把null往后放,其他的维持原顺序。

static Ordering<Object>    arbitrary() 跟Comparator类似,这种排序方式下,看compare方法返回的结果。
static <T> Ordering<T>    compound(Iterable<? extends Comparator<? super T>> comparators)
  返回一种排序策略,依次使用comparators来比较,如果某个comparator比较的结果为相等,则用下一个,否则直接返回这个比较结果。
  这个类似于sql里面的order by column1,column2,...
static <T> Ordering<T>    explicit(List<T> valuesInOrder) 返回一种排序策略,主要看元素在valuesInOrder中出现的次序。
static <T> Ordering<T>    explicit(T leastValue, T... remainingValuesInOrder)  等价于explicit(Lists.asList(leastValue, remainingValuesInOrder)); 把最小的一个元素单独作为参数了

static <T> Ordering<T>    from(Comparator<T> comparator)  将comparator转换为Ordering
static <C extends Comparable> Ordering<C> natural() 返回自然排序这种排序策略
static Ordering<Object>    usingToString() 使用toString()返回的结果进行自然排序

int binarySearch(List<? extends T> sortedList, T key) 采用二分查找算法查找元素,排序算法就是Ordering指定的
abstract int compare(@Nullable T left, @Nullable  T right) 比较2个对象,Ordering的排序就是靠这个
<U extends T> Ordering<U> compound(Comparator<? super U> secondaryComparator) 跟static方法compound类似,会先用this排序来比较,如果比较结果相等,则用secondaryComparator再来比
<S extends T> Ordering<Iterable<S>> lexicographical() 按词典序比较两个Iterable对象的大小,谁元素多谁大,元素个数相同则看谁前面的元素大

<E extends T> List<E>    greatestOf(Iterable<E> iterable, int k)  返回第k大的元素,使用本排序规则,k从0计数
<E extends T> List<E>    greatestOf(Iterator<E> iterator, int k)  同上
同样的还有同上的leastOf方法 返回第k小的元素

<S extends T> Ordering<S> nullsFirst() 在原有排序规则上新加规则:null值排最前面
<S extends T> Ordering<S> nullsLast() 在原有排序规则上新加规则:null值排最后面

<F> Ordering<F>    onResultOf(Function<F,? extends T> function) 先用function转换对象,再用本规则来排序
<S extends T> Ordering<S> reverse() 将原排序规则倒序
<E extends T> List<E> sortedCopy(Iterable<E> iterable) 排序后的结果copy一份返回
<E extends T> ImmutableList<E> immutableSortedCopy(Iterable<E> iterable) 排序后的结果copy一份不可变的list返回

boolean    isOrdered(Iterable<? extends T> iterable) 比较是否有序,即compare(prev, next)<=0
boolean    isStrictlyOrdered(Iterable<? extends T> iterable) 比较是否严格有序,即compare(prev, next)<0

<E extends T> E max(E a, E b)  返回较大的元素,使用本排序规则
<E extends T> E max(E a, E b, E c, E... rest)  返回最大的元素,使用本排序规则
<E extends T> E    max(Iterable<E> iterable)  返回最大的元素,使用本排序规则
<E extends T> E max(Iterator<E> iterator)  返回最大的元素,使用本排序规则
同样的还有同上的min方法

(4) Objects里面的方法:equal,hashCode,ToStringHelper 
 我们都知道java.lang.Object里面有下面几个抽象方法:equals,hashCode,toString。
 guava里面提供了方法帮我们快速实现这些抽象方法。

 static boolean    equal(Object a, Object b) 判空了
 static int hashCode(Object... objects) 计算hashcode,底层其实调用了Arrays.hashCode
 static class ToStringHelper  帮助生成可读性好的toString字符串,一般会包含class的name以及各个成员的值
 static Objects.ToStringHelper    toStringHelper(Class<?> clazz) 返回ToStringHelper对象,clazz是对象的类型
 static Objects.ToStringHelper    toStringHelper(Object self)  返回ToStringHelper对象,self.getClass会作为对象的类型
 static Objects.ToStringHelper    toStringHelper(String className) 返回ToStringHelper对象,className是对象的类型
 代码示例:Objects.toStringHelper(this).add("x", "aaa")
 说明:ToStringHelper好像没有使用反射自动获取各个成员的值,需要自己手动add?

 (5)ComparisonChain.compareTo

   如果对象实现了Comparable接口,我们需要实现compare方法来比较两个对象的大小。
 ComparisonChain提供了快速方法帮助我们简化这个代码。
    public int compareTo(Foo that) {
     return ComparisonChain.start()
         .compare(this.aString, that.aString)
         .compare(this.anInt, that.anInt)
         .compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast())
         .result();
   }
   可以看到,我们用了3次比较来确定this和that的大小。如果aString已经有结果了,后面就不会执行了。
   compare有很多重载的版本,用于比较各种类型值的大小。布尔值的比较比较特殊,可以用下面的方法比较:
   compareFalseFirst(boolean left, boolean right) 用来比较boolean值的大小, false的小一些。
   compareTrueFirst(boolean left, boolean right) 用来比较boolean值的大小, true的小一些。
   其实,guava更推荐我们使用Ordering来比较对象大小,而不是自己实现Comparable接口。


   (6) Throwables 处理异常
   Throwables类提供了一些静态工具方法,帮我们更好的处理异常。
   static List<Throwable> getCausalChain(Throwable throwable) 以list的方式得到throwable的异常链
   static Throwable getRootCause(Throwable throwable) 返回最底层的异常
   static String getStackTraceAsString(Throwable throwable) 返回printStackTrace的结果string

   有时候,我们捕获到异常后,只会对感兴趣的异常重新抛出,其他的异常就抛出RuntimeException好了。
   和Java 7的 multi-catch and rethrow类似。
   try {
     someMethodThatCouldThrowAnything();
   } catch (IKnowWhatToDoWithThisException e) {
     handle(e);
   } catch (Throwable t) {
     Throwables.propagateIfInstanceOf(t, IOException.class);
     Throwables.propagateIfInstanceOf(t, SQLException.class);
     throw Throwables.propagate(t);
   }

   static <X extends Throwable> void propagateIfInstanceOf(Throwable throwable, Class<X> declaredType) 如果throwable是declaredType类型的异常,则抛出declaredType的异常
   static void propagateIfPossible(Throwable throwable)  如果throwable是Error或者RuntimeException的异常,则抛出Error或者RuntimeException的异常
   static RuntimeException propagate(Throwable throwable) 如果throwable是Error或者RuntimeException的异常,则抛出Error或者RuntimeException的异常,否则也会强行抛出RuntimeException的异常。这个方法返回RuntimeException,其实永远不会,只是为了可以写成throw propagate(throwable),让编译器认为确实throw了。
   static <X extends Throwable> void propagateIfPossible(Throwable throwable, Class<X> declaredType) 如果throwable是declaredType类型的异常,则抛出declaredType的异常;否则,如果throwable是Error或者RuntimeException的异常,则抛出Error或者RuntimeException的异常
   static <X1 extends Throwable,X2 extends Throwable> void propagateIfPossible(Throwable throwable, Class<X1> declaredType1, Class<X2> declaredType2) 跟上个方法类似,不过会先检查declaredType1和declaredType2两种异常,否则再判断Error或者RuntimeException

MVDR算法: 自适应波束形成在信号处理领域中扮演着重要的角色。本文将介绍MVDR(最小方差无失真响应)算法,并提供相应的Matlab源代码实现。 MVDR算法是一种用于抑制干扰信号并增强感兴趣信号的自适应波束形成算法。它的基本思想是通过对干扰信号进行空间滤波,使其在感兴趣信号方向上的输出功率最小化。这种方法可以提高信号的质量和可辨识度,特别是在存在多个干扰源的复杂环境中。本文将介绍MVDR(最小方差无失真响应)算法,并提供相应的Matlab源代码实现。使用MVDR算法,我们可以通过对观测信号进行波束形成来抑制干扰信号并增强感兴趣信号。以上是MVDR算法的Matlab实现。的每一列代表一个阵列元素的观测信号。表示期望的波束指向,即感兴趣信号的方向。 阅读详情

相关推荐

MATLAB新手也能懂:用MATPOWER 8.0b搞定电力系统潮流计算(附case9实战代码)

本文详细介绍了如何使用MATPOWER 8.0b在MATLAB中进行电力系统潮流计算,特别适合新手入门。通过case9实战案例,讲解了从安装配置到运行牛顿-拉夫逊法潮流计算的全过程,包括结果分析和常见问题处理,帮助读者快速掌握这一电力系统分析的核心技能。

weixin_26757925的博客 380

guava ComparisonChain的源码实现

guava ComparisonChain源码的实现十分精妙,用到了利用内部类实现单例设计模式以及利用状态设计模式。代码十分优雅。 上源码欣赏: public abstract class ComparisonChain { //构造函数私有 单例模式 private ComparisonChain() {} /** * Begins a new chaine...

一木一草一枯荣 283

机械臂电机力矩计算

设计 6 轴机械臂时,电机力矩计算是确保机械臂负载能力、运动精度和安全性的核心环节,需围绕和两大核心展开,结合机械臂结构参数(如关节长度、质量分布)、负载需求(如末端负载重量、惯性)和运动参数(如加速度、角速度)逐步推导。

ZPC8210的博客 1857

Google Guava 工具集__3__ Ordering犀利的比较器 Object方法

Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering和JDK Comparator相比功能更强。它非常容易扩展,可以轻松构造复杂的comparator,然后用在容器的比较、排序等操作中。   本质上来说,Ordering 实例无非就是一个特殊的Comparator 实例。Ordering只是需要依赖于一个比较器(例如,Collections.max)的

2.wa 2209

Jetson设备EXT4文件系统修复实战:从superblock损坏到系统恢复

本文详细介绍了Jetson设备因异常断电等原因导致EXT4文件系统superblock损坏后的诊断与修复实战。通过从健康设备移植fsck工具、使用备份超级块等步骤,指导用户逐步恢复系统,并提供了数据备份与预防措施,帮助用户有效应对嵌入式AI开发中的存储故障。

theta的博客 592

从零编写linux0.11 - 第二章 内核初始化

编程环境:Ubuntu Kylin 16.04 代码仓库:https://gitee.com/AprilSloan/linux0.11-project linux0.11源码下载(不能直接编译,需进行修改) 1.添加内核 进入内核后也不是马上进入main函数,上一章只是暂时设置gdt,此外还要设置idt和其他的一些初始化操作,这些内容也要使用汇编进行编写,此处采用AT&T格式的汇编。 以下为head.s的内容,为了简单起见,内容还是一个死循环。 .globl startup_32 startup_3

皓空Fly的博客 1265

Guava学习(四):Ordering(流畅风格排序器)

Guava学习(四):Ordering(流畅风格排序器)   排序器[Ordering]是Guava流畅风格比较器[Comparator]的实现, 它可以用来为构建复杂的比较器, 以完成 集合排序的功能。   从实现上说, Ordering实例就是一个特殊的Comparator实例。 Ordering把很多基于Comparator的静态方法(如Collections.max) 包装为自己的实例方法...

LoveLifeAndLoveCode的博客 479

ESP32 LVGL开发板例程使用记录:自制常用汉字字库(二)

1、将下载的文件移入工程文件中 ,路径为项目文件中 ”......\lib\lvgl\src\font“文件夹下。3、修改字库配置文件,文件名为lv_conf.h中的内容,向其中加入下面内容(位置可搜索注释块来找到地方)修改完成可以编译试试,看是否成功,如字库较大时编译出错,请使能:LV_FONT_FMT_TXT_LARGE。2、打开此文件,修改包含头文件的路径,不然会报错,修改方法可对照自己库中其他字库文件中的包含路径。导入完成后在VSCode工程中可以查看到此文件。上次说完了如何制作 字库.c 文件。

qq_43279097的博客 1957

Optional使用和避免Null - Google Guava

Guava Optional 类 Optional 用于包含非空对象的不可变对象。 Optional对象,用于不存在值表示null。这个类有各种实用的方法,以方便代码来处理为可用或不可用,而不是检查null值。 常用方法 方法类型 方法描述 static<T>Optional<T> absent() 返回没有包含引用的Optio...

程序员咏哥的博客 1588

在 SAP S/4HANA Public Cloud 中,用 RAP 一键生成 PDF 并在 Fiori 前端触发下载的完整方案

create;update;delete;// 生成并返回当前文档上下文。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 410

彻底讲透 SAP 中的 client-safe:从 CDS、AMDP 到 ABAP Cloud 的客户端隔离设计

SAP系统中的client-safe概念定义了技术边界:访问client-dependent数据的对象必须确保只看到单个client数据,而访问client-independent数据的对象则天然满足条件。这一原则直接影响CDS视图、AMDP等核心组件,并与ABAP Cloud开发模型紧密集成。在业务系统中,client isolation要求用户只能看到当前登录client的数据。SAP通过语言版本、对象规则和静态检查强制执行这一约束,特别是在ABAP Cloud开发中,AMDP方法和发布的API必须满足

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3263

Google Guava 用法指南

Google Guava 的用法

weixin_42614150的博客 251

手把手教你学Simulink--基于新型通信技术集成的场景实例:无人机利用激光通信实现高速率数据传输

摘要: 本文基于Simulink搭建无人机激光通信仿真系统,解决传统射频通信带宽不足问题。系统通过五层架构(发射机、信道、PAT系统、接收机、性能分析)实现Gbps级高速传输,重点建模大气衰减(雾/雨)、光束发散、PAT精跟踪(Stateflow+PID控制)等核心模块。仿真结果显示:晴天链路可达2.5Gbps(BER 1e-8),浓雾下链路中断,验证了雾是主要性能限制因素。案例涵盖调制方式选择、动态环境仿真及3D可视化,为无人机高速数据传输提供可扩展的仿真框架,并指出混合FSO/RF、AI-PAT等优化方

MHD0815的博客 180

guava_collections

引言集合对于任何一门语言都是必须的。没有集合我们写不出一些复杂的逻辑。Guava继承扩展了Google Collections的一些功能。 从 com.google.common.collect包下面的类的数量,我们就可以看出Collections的重要性。 虽然已经有了这么多的工具类,但是还是有很多场景我们没有覆盖到,我们希望我们能够覆盖到日常使用的哪些。 下面我们就在每天的编程中经常会使用的类做

我不是为了输赢 我就是认真 1983

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java的compare比较

package com.jckb; public class Name implements Comparable<Name>{ private String firstName; private String lastName; public Name(){} public Name(String firstN...

weixin_30782331的博客 651

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Guava链式风格Ordering比较器实例

1.简介Ordering 实例无非就是一个特殊的Comparator 实例。Ordering只是需要依赖于一个比较器(例如,Collections.max)的方法,并使其可作为实例方法。另外,Ordering提供了链式方法调用和加强现有的比较器,可以轻松构造复杂的comparator。2.实例场景是对一个list中的元素按照一定规则排序,首先我们新建一个TestOrder类:import com.s

sswmjoy的专栏 428

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【Guava】Optional接口来避免空指针错误

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34368949的博客 142

Guava-流式风格比较器Ordering

Ordering是Guava流畅风格比较器[Comparator]的实现,它可以用来为构建复杂的比较器,以完成集合排序的功能。从实现上说,Ordering实例就是一个特殊的Comparator实例。Ordering把很多基于Comparator的静态方法包装为自己的实例方法,并且提供了链式调用方法,来定制和增强现有的比较器。 创建排序器: natural() 对可排序类型做自然排序,如数字按大

Tracycater的专栏 1334

[Google Guava]--Optional类

扯淡一下:      刚刚换了新工作,新的公司,新的同事,很好的伙伴们,都很喜欢;新的业务,新的技术,新的挑战:开启新的旅程,Fighting!       这阵子一直了解公司业务,看前辈们的代码,发现很多新的技巧,技术,学习好多;那么先从第一个利器:Guava开始说起吧,今天来一张博客,后面持续更新该方面的文章。简介:      Optional用于包含非空对象的不可变对象。 Optional对...

Franco的博客 2032

Guava(六)ComparisonChain和primitives包

转载出处:http://ajoo.iteye.com/blog/740079 有时候我们不可避免地要实现Comparator, 好做排序之类的事情.  要比较两个整数的时候, 我一度曾经这么写:  Java代码   return a - b;   多简单啊! 如果a比b大, 无疑这个东西返回正数了.  可惜啊, 现实永远比理想残酷.

wea111222333的博客 637

Guava 库整理

参考: http://codemunchies.com/2009/10/beautiful-code-with-google-collections-guava-and-static-imports-part-1/ (2,3,4) http://blog.publicobject.com 更多用法参考http://ajoo.iteye.com/category/119082 以前这

fover717的专栏 1858

使用Guava的ComparisonChain实现自定义的排序

 可以看到使用比较器前,先要写一个实体类,还要实现comparable接口,实现compareTo方法。这个方法一般会返回-1 0 1三个int类型数字,分别表示,对象和传入的对象比较,排序应该在传入的对象之后。因为比较器通常是为了集合排序而实现的。 ComparisonChain 的好处就在于,可以用method().method().这样的链式比较,而不用if else这种可读性很差的面向过程...

weixin_34034670的博客 261

Guava学习(五):ComparisonChain(比较链)

Guava学习(五):ComparisonChain(比较链) 主要作用是帮助我们实现对象的比较(如果对象有多个字段,我们希望比较的时候是根据多个字段来比较的),没用这个之前我们通常这样写: class Person implements Comparable { private String lastName; private String firstName; ...

LoveLifeAndLoveCode的博客 2004

Guava(瓜娃)学习笔记

Guava(瓜娃)学习笔记 Guava工程包含了若干被google的java项目广泛依赖的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [commonannotations] 、字符串处理 [string processing] 、I/O

我是程序猿 4万+

Flink 日志解析任务性能优化实战:正则/Grok 预编译、Guava 缓存权重陷阱与 ES 写入隔离

Flink 日志解析任务吞吐不达标的根因往往不在解析逻辑本身:本文逐算子定位四大 P0 瓶颈——正则/Grok 每条重新 Pattern.compile、同一记录被 JSON 反复序列化 3~4 次、Guava 缓存 maximumWeight=4 权重语义配错导致每条回源 Redis、Checkpoint 未启用且状态无 TTL;给出预编译缓存、算子间传对象、RocksDB 状态后端、ES 写入异步隔离等修复方案与优先级清单,附 8 条通用性能检查清单。

Sayai的专栏 450

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 284
上一篇: HTTP协议之状态码详解
下一篇: java强引用,软引用,弱引用,虚引用
leadtoit
博客等级 码龄17年 2粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值