首页 文章 精选 留言 我的

精选列表

搜索[模糊效果],共10006篇文章
优秀的个人博客,低调大师

Kotlin 模糊知识点

1,as 关键字的作用,表示强转类型,example 打开软键盘的代码 fun openKeyboard(context: Context, editText: EditText) { val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.showSoftInput(editText, InputMethodManager.RESULT_SHOWN) imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY) } 解释:注意一点即可以观察出来,如果不进行强转,本身默认是 Object 类型,那么怎么会有 showSoftInput 方法和 toggleSoftInput 的方法呢。 2,object 关键字和 companion object 关键字都可以用来实现单例模式。不但如此,object 还常用来实现匿名内部类。 object 可以定义在全局也可以在类的内部使用 object 就是单例模式的化身 object 可以实现 Java 的匿名内部类 companion object 就是 Java 中的 static 变量 companion object 只能定义在对应的类中 tips:除此之外,除此之外,除此之外 object 可以作为变量的定义也可以是表达式 object 匿名类可以继承并超越 Java 中匿名类而实现多个接口 object 表达式当场实例化,但定义的 object 变量是延迟实例化的 object 匿名内部类还可以引用并更改局部变量 companion object 甚至还可以被扩展 object 可以实现 kotlin 的单例模式,可以定义在全局中,也可以定义在类的内部。但是需要注意: 1.object 定义后即刻实例化 2.因此 object 不能有定义构造函数 3.定义在类内部的 object 并不能访问类的成员 companion object 的定义完全属于类的本身,所以 companion object 肯定不能脱离类而定义在全局中。有些像 Java 中的 static 变量。也可以实现接口,因为 companion object 寄生于类,甚至类还可以直接作为相对应的接口的参数形式传入。 在 Java 中,内部类是不可以访问外部的非 final 成员变量的,也就是说:它不允许更改变量值!但是,kotlin 的 object 可以。 3,var 和 val 的唯一区别是 var 既有 getter 又有 setter,val 只有 getter 没有 setter。其中 val 与 Java 中的 final 不完全相同。只有一种情况他们完全相同,就是像 private val foo = 3 这样,以 private 修饰,赋予初始值,并且不提供自定义的 getter,不被委托的属性,这个属性完全等同于 Java 中的 private final int foo = 3。因为 kotlin 默认是 public 属性,如果是权限修饰符是 private 的话那么就不能外部访问,再加上是以 val 修饰的,所以没有 getter 和 setter 方法。 4,kotlin 中 open 关键字什么时候使用,init 关键字什么时候使用。 Kotlin 类默认是 final,这点可以自己尝试反编译下 Kotlin 代码就可以发现。所以如果你想扩展一个类的话,就必须使用 open 修饰符才行。 Kotlin 中的类可以有一个主构造器,以及一个或多个次构造器,主构造器是类头部的一部分,位于类名称之后 class Person constructor(firstName: String) {} 一般情况下 constructor 关键字可以省略。tips:主构造器中不能包含任何代码,初始化代码可以放在初始化代码段中,使用 init 关键字作为前缀。 class Person constructor(firstName: String) { init { System.out.print("FirstName is $firstName") } } 5,kotlin 代码转换成 Java 代码,选择 tools -> kotlin -> show kotlin bytecode (展示字节码文件) -> Decompile 即可以显示出来相对应的 Java 代码。 6,注意在 kotlin 中之所以可以直接访问属性名来获取值就是因为 kotlin 自动生成了 getter 和 setter 方法。

优秀的个人博客,低调大师

PostgreSQL如何对某行记录进行模糊查询

在某些场景下,我们可能需要对表的某行字段进行查询。 例如BI报表的下拉框,用户可能会勾选多个条件进行查询,那么我们查询会很麻烦。 例如: bill@bill=>create table test1(c1 int,c2 text,c3 text,c4 text); CREATE TABLE bill@bill=>insert into test1 values(1,'post','china','bill'); INSERT 0 1 如果我们要查询该表某行包含china的记录,我们可能需要这么去写: select * from test1 where c1 ~ 'china' or c2 ~ 'china' or ... 可以看到这样写会相当麻烦,而且性能也不尽人意。 那么我们有什么办法能解决这类问题呢? 全文检索,我们可以通过行级别的全文检索来处理这类问题。 例子: 这里我们以pg_scws分词插件来演示。 下载地址:https://github.com/jaiminpan/pg_scws 安装: git clone https://github.com/jaiminpan/pg_scws cd pg_scws USE_PGXS=1 make && make install 以上面的表为例,我们可以将改行记录转成一个全文检索的文本: bill@bill=>select to_tsvector('scwscfg',test1::text) from test1; to_tsvector --------------------------------------- '1':1 'bill':4 'china':3 'post':2 (1 row) 查询: bill@bill=> select to_tsvector('scwscfg',test1::text) @@ to_tsquery('post & china') from test1; ?column? ---------- t (1 row) 至此,我们实现了对行级记录的全文检索查询,接着让我们再创建行级全文检索的索引来加速查询。 首先我们需要创建immutable类型的函数。 bill@bill=> create or replace function f1(regconfig,text) returns tsvector as $$ bill$# select to_tsvector($1,$2); bill$# $$ language sql immutable strict; CREATE FUNCTION 需要将record_out和textin函数转为immutable类型: bill@bill=>alter function record_out(record) immutable; ALTER FUNCTION bill@bill=>alter function textin(cstring) immutable; ALTER FUNCTION 创建索引: bill@bill=> create index idx_test1 on test1 using gin (f1('scwscfg'::regconfig,test1::text)) ; CREATE INDEX 查询测试: bill@bill=>select * from test1 where f1('scwscfg'::regconfig,test1::text) @@ to_tsquery('china') ; c1 | c2 | c3 | c4 ----+------+-------+------ 1 | post | china | bill (1 row) 验证是否可以使用索引: bill@bill=>set enable_seqscan = off; SET bill@bill=> explain select * from test1 where f1('scwscfg'::regconfig,test1::text) @@ to_tsquery('china') ; QUERY PLAN ------------------------------------------------------------------------------------------------------- Bitmap Heap Scan on test1 (cost=2.85..4.67 rows=1 width=100) Recheck Cond: (to_tsvector('scwscfg'::regconfig, (test1.*)::text) @@ to_tsquery('china'::text)) -> Bitmap Index Scan on idx_test1 (cost=0.00..2.85 rows=1 width=0) Index Cond: (to_tsvector('scwscfg'::regconfig, (test1.*)::text) @@ to_tsquery('china'::text)) (4 rows) 参考链接: https://github.com/jaiminpan/pg_scws http://www.postgres.cn/docs/13/textsearch.html

优秀的个人博客,低调大师

设计模式那些模糊不清的概念

关注 “Java艺术” 我们一起成长! 23种设计模式属于结构型模式,而mvc模式等属于架构型模式。本篇要讨论的设计模式指的是结构型设计模式。 有时候我们在项目中使用设计模式也不能准确的说出自己使用的是哪种设计模式,这就是设计模式难学的地方,总的来说,就是偏理论、难理解。 设计模式是前人总结出的一套高效编程方式,使用设计模式能够为功能模块提供更好扩展性,为代码带来更好的可读性,一定程度上也是对代码性能方面的调优。 当我们清楚的知道使用设计模式的目的在于此之后,也就不用再去生搬硬套的使用设计模式了。在实际开发中,我们需要结合实际场景考虑使用何种设计模式,即便使用同一种设计模式,在不同的场景下也有不同的用法。 23种设计模式中,每一种都可以稍作改动以迎合实际使用场景,并且这些设计模式不仅可以单独使用,有时候也可以组合使用,如组合模式与策略模式的组合使用。 本篇将从笔者的角度,以常用的、比较容易搞混的设计模式为例,分享笔者对设计模式及其运用的理解,仅供参考。 本篇内容: 责任链模式 过滤器、拦截器与责任链的关系 代理模式与委托模式的关系 组合模式与策略模式的组合使用 适配器模式 适应不同场景的使用方式 责任链模式 参考维基百科:责任链模式包含了一些命令对象和一系列的处理对象,每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。该模式还描述了往该处理链的末尾添加新的处理对象的方法。 责任链模式我们并不陌生,Netty中的ChannelHandler、Sentinel的Slot都有运用责任链模式。 Netty中的ChannelHandler责任链模式: (图片来源:《Netty 中的 handler 和 ChannelPipeline 分析》 https://www.cnblogs.com/rickiyang/p/12686593.html) Sentinel中的Slot责任链模式: (图片来源:《深入理解Sentinel》 https://gitbook.cn/gitchat/column/5f34b38305cd3d35a3b01d4a) 举例Netty与Sentinel的目的也在于这两者在运用上存在些许区别,前者实现的是双向传递的责任链,后者则是单向传递。两者也存在共同点,都是使用链表将一系列处理对象连成责任链。 除了使用单向或者双向链表方式实现责任链调用模式,还可以使用集合实现,将处理对象按顺序放入集合中,通过遍历集合方式调用。 过滤器、拦截器与责任链的关系 在23种设计模式中,并没有对过滤器模式与拦截器模式单独定义,在wiki上也只是将这两者归类为结构型设计模式。 无论是过滤器模式还是拦截器模式,在实现上,两者都依赖责任链模式,因此,笔者将过滤器模式与拦截器模式看作是责任链模式的一种衍生模式,是责任链模式的一个变种,但不能使用等号。 过滤器模式是将所有过滤器对象构成链表,只要其中一个过滤器满足条件,那么后续的过滤器将不会被调用,命令最终可由该过滤器处理。 过滤器的过滤方法一般返回boolean值,表示过滤或不过滤,当过滤方法返回值类型为void时,表示过滤器在决定过滤当前命令后,必须对该命令作出响应以结束命令处理。 过滤器模式对过滤器的调用顺序并没有严格要求,是否要求顺序主要取决于具体的使用场景。 如需考虑优先级的黑白名单过滤器,顺序不同结果截然不同; 如Shiro使用过滤器模式实现的认证授权功能。 (Shiro框架过滤器模式) 拦截器模式与过滤器模式大致相同,常见与动态代理模式结合使用,拦截器可以拦截方法调用(请求)或者改变方法调用(请求)传递的参数。 代理模式与委托模式的关系 参考维基百科:代理模式的目标是定义代理对象,该对象在客户端和实际主体之间操作,以控制对真实主体的访问,并在每次访问真实主题时执行必要的任务。 代理模式也分动态代理和静态代理,其中动态代理模式是使用最广、最多的代理模式。代理模式也是使用最多的设计模式之一。 参考维基百科:委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 代理模式与委托模式到底哪里不同也是饱受争议。 在23种设计模式中并没有对委托模式单独定义,有人认为,委托模式只是代理模式的别称,也有人认为,委托并不一定要调用相同方法,也不需要实现相同接口,而代理是代理一个方法或者一个接口的所有方法。 从定义上来看,两者确实是不同的设计模式,对于上述两种观点,如果要论对错,笔者更认可后者。 笔者曾经使用C#开发windows应用程序使用比较多的是委托模式,如处理一个日记事件,当监听到日记时,委托一个类去将日记显示到前端控件上,委托者委托受托者将日记显示,两者之间并没有严格的约定。 (c#写的聊天软件:M.Friend) 这是来自知乎的回答,可参考:委托,是委托人与受托人约定,由受托人处置委托人委托的事务的民事法律关系;代理是代理人在代理权限内,以被代理人的名义实施民事法律的行为。好像这样描述更难理解了。 组合模式与策略模式组合使用 参考维基百科:组合模式也叫复合模式,复合模式描述一组对象,这些对象与相同类型对象的单个实例处理的方式相同。复合的目的是将对象"组合"到树结构中,以表示部分整体层次结构。 通俗的理解,组合模式是将实现同一个接口的实例组合到一起,也可以将多个相同类型的组合组合到一起,构成一棵数。当外部调用这棵数的方法时,所有的叶子节点的方法都会被调用。 组合模式我们可能比较陌生,所以我们看一个实例来理解。 1、声明组合中的对象接口:组件(Component),并提供接口实现类(Leaf); 2、定义具有组件行为的组合类,存储组件、支持添加组件; 3、通过组合操作组合中的对象。 参考维基百科:策略模式指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。 组合模式与策略模式组合使用,在SpringBoot的web框架中非常常见,例如实现方法参数解析。 定义方法参数解析器(HandlerMethodArgumentResolver),HandlerMethodArgumentResolver即是策略模式中的策略接口(Strategy),也是组合模式中的组件(Component)。 组合模式将具有相同处理方式的对象组合到一起,也就是将所有方法参数解析器组合到一起。 策略模式根据方法参数的类型或者参数上的注解等选择一个能够解析该方法参数的解析器,由解析器从请求(数据包)中解析出方法参数。 HandlerMethodArgumentResolverComposite即是组合模式中的组合(Composite),也是策略模式中的Context。 RequestResponseBodyMethodProcessor负责解析被@ResponseBody注解注释的方法参数、PathVariableMethodArgumentResolver负载解析被@PathVariable注解注释的方法参数,这些都是组合模式中的叶子节点(Leaf),也是策略模式中的实体策略。 适配器模式 适配器模式的定义:适配器模式是使因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。 以实现支付结果回调失败定时重试为例,假设现有两种失败定时重试实现方案: 一种是支持使用cron表达式的失败定时重试; 另一种是支持自定义周期的失败定时重试,如间隔2秒、4秒、8秒...后重试。 使用适配器模式将两种方式组合到一起对外提供服务,并且做一些扩展。 对于外部调用者而言,只需要访问一个接口就能获得多种方式的支持,内部多种方式一起对外提供服务。 适应不同场景的使用方式 如何理解设计模式应当为适应不同场景作出改变?我们以封装json序列化和反序列化工具为例。 在实际项目中,我们可以使用gson、Jackson等框架实现Java对象的序列化与反序列化,但一般我们不会同时使用多个,也不会存在面对不同的业务使用不同框架的情况。相反的,一般我们只会选择其中一种,并且不会经常改变。 使用策略模式可以实现后期切换框架而不需要修改业务代码,但这种场景下,我们真的需要教科书式的实现策略模式吗。 最适合的方法应当是根据引入不同的框架决定使用哪种序列化策略,通过类加载实现“策略”,这种微妙的改变为封装的组件提供了更智能的策略。 例如,我们在项目中添加gson的依赖后,整个项目的序列化和反序列化工作都将由gson完成,而当我们把依赖gson改为依赖Jackson时,整个项目的序列化和反序列化工作都将自动切换到Jackson。 设计模式不应该被生搬硬套的使用,否则也就违背了使用设计模式的初衷。如果你也赞同我的观点,欢迎点赞、在看、转发。 [Java艺术] 微信号:javaskill 一个只推送原创文章的技术公众号, 分享Java后端相关技术。 本文分享自微信公众号 - Java艺术(javaskill)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册