关闭。这个问题是opinion-based .它目前不接受答案。
想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.
7年前关闭。
Improve this question
我正在考虑让我的混合技能水平的团队使用 Google Guava。在加入 Guava 之前,我会使用 Apache Collections(或其通用版本)。
Guava 与 Apache Collections 不同,在某些方面似乎更强大,但对于经验不足的程序员来说可能不太容易使用。这是我认为可以证明这一点的一个领域。
我继承的代码包含大量循环遍历本质上是异构值映射的列表,探测它们的值,进行空检查,然后做一些微不足道的事情:
boolean foo( final List< MapLike > stuff, final String target ) {
final String upperCaseTarget = target.toUpperCase(0;
for( MapLike m : stuff ) {
final Maplike n = (MapLike) m.get( "hard coded string" );
if( n != null ) {
final String s = n.get( "another hard code string" );
if( s != null && s.toUpperCase().equals( upperCaseTarget ) ) {
return true ;
}
}
return false ;
}
boolean foo( final List< MapLike > stuff, final String target ) {
Collection< String> sa = (Collection< String >) CollectionUtils.collect( stuff,
TransformerUtils.chainedTransformer( new Transformer[] {
AppUtils.propertyTransformer("hard coded string"),
AppUtils.propertyTransformer("another hard coded string"),
AppUtils.upperCaseTransformer()
} ) );
return sa.contains( target.toUpperCase() ) ;
}
boolean foo( final List< MapLike > stuff, final String target ) {
Collection< String > sa = Collections2.transform( stuff,
Functions.compose( AppUtils.upperCaseFunction(),
Functions.compose( AppUtils.propertyFunction("another hard coded string"),
AppUtils.propertyFunction("hard coded string") ) ) );
return sa.contains( target.toUpperCase() ) ;
// or
// Iterables.contains( sa, target.toUpperCase() );
// which actually doesn't buy me much
contains在实时 View 中可能会多次应用(组合)函数,所以我真正应该做的是: return ImmutableSet.copy( sa ).contains( target.toUpperCase() ) ;
// List always uses linear search? So no value in copying?
// or perhaps I should copy it into a set?
boolean contains( final List list, final Object target ) {
return list.contains( target ) ;
}
// Set doesn't use linear search, so copy?
boolean contains( final Set set, final Object target ) {
//return ImmutableSet.copy( set ).contains( target ) ;
// whoops, I might have nulls
return Sets.newHashSet( set ).contains( target ) ;
}
// Set doesn't use linear search, so copy?
boolean contains( final Set set, final Object target ) {
final Set search = set.size() > 16 : Sets.newHashSet( set ) : set ;
return search.contains( target ) ;
}
transform”,我想答案是,“好吧,总是将它返回的内容转储到新的集合中,或者编写自己的转换这样做”。最佳答案
我想说 Guava 绝对不比 Apache Collections 更难使用。我会说这实际上要容易得多。
Guava 的一大优点是它不会暴露这么多新的对象类型……它喜欢将它使用的大多数实际实现类型整齐地隐藏在只暴露接口(interface)的静态工厂方法后面。取各种Predicate s,例如。在 Apache 集合中,您拥有顶级公共(public)实现类,例如:
NullPredicate
NotNullPredicate
NotPredicate
AllPredicate
AndPredicate
AnyPredicate
OrPredicate
Predicates :Predicates.isNull()
Predicates.notNull()
Predicates.not(...)
Predicates.and(...)
Predicates.or(...)
PredicateUtils ,事实是它暴露了其 Predicate 的类型s 使其更难使用。在我看来,Apache Collections 只是一堆不必要的可见类和不是非常有用的部分,这些部分会增加困惑并使获取和使用有用部分变得更加困难。当您查看两个库公开的类和接口(interface)的数量时,区别就很明显了:Functions.compose 选择的顺序更直观(尽管我认为这是一个非常主观的论点)。请注意,在您使用 Guava 进行组合的示例中,应用函数的顺序从声明的末尾到分配最终结果的位置。您的示例的另一个问题是开始时它不是类型安全的,因为原始示例涉及转换 get 的结果。方法到另一种类型。 Guava的优势compose在 Transformer 的数组上Apache Commons 示例中的 s 是 compose可以执行类型安全的函数组合,确保(在编译时)您正在应用的一系列函数将正常工作。 Apache 版本在这方面是完全不安全的。Collections2.transform的直播“问题” .坦率地说,你在这一点上完全错了。使用实时 View 而不是复制原始元素的所有元素 Collection成新Collection实际上效率更高!以下是您拨打 Collections2.transform 时会发生的事情然后拨打 contains在 Collection它返回:Collection包装原件创建...原件和Function两者都简单地分配给其中的字段。 Collection的迭代器被检索。 Iterator 中的每个元素, Function将被应用,获取该元素的转换值。 equals找到您要检查的对象,contains将返回。您只需迭代(并应用 Function )直到找到匹配项! Function每个元素最多应用一次! ArrayList存储转换后的值。 Collection的迭代器。 Collection 中的每个元素的迭代器,应用该函数并将结果添加到新的 Collection .这是为原始 Collection 的每个元素完成的。 ,即使应用 Transformer 的结果到第一个元素将匹配我们正在寻找的对象! contains将迭代新 Collection 中的每个元素寻找结果。 Collection 的最佳和最坏情况使用两个库的大小为 N。最好的情况是当第一个元素的变换值 equals您正在寻找的对象 contains最坏的情况是您正在寻找的值 contains不存在于转换后的集合中。Function 1 次,存储 0 个附加元素。 Function N 次,存储 0 个附加元素。 Transformer N 次,存储 N 个附加元素(转换后的集合)。 Transformer N 次,存储 N 个附加元素(转换后的集合)。 Iterables.contains存在只是为了让您检查是否 Iterable你不知道是Collection包含一个值。如果Iterable你给的其实是Collection ,它很好地只是调用 contains()在那Collection以便您获得更好的性能(如果它是 Set ,比如说)。
关于java - Google Guava "harder"是否比 Apache Collections 更有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3947560/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查