我使用TreeBidiMap来自Apache的集合库.我想对这些值进行排序doubles.
我的方法是Collection使用以下方法检索一个值:
Collection coll = themap.values();
Run Code Online (Sandbox Code Playgroud)
这自然很好.
主要问题:我现在想知道如何转换/转换(不确定哪个是正确的)coll到一个List可以排序?
然后我打算遍历排序的List对象,该对象应按顺序从TreeBidiMap(themap)中使用themap.getKey(iterator.next())迭代器将在列表上的位置获取相应的键doubles.
在搜索一些代码时,我遇到了箭头操作符,它到底是做什么的?我以为Java没有箭头操作符.
return (Collection<Car>) CollectionUtils.select(listOfCars, (arg0) -> {
return Car.SEDAN == ((Car)arg0).getStyle();
});
Run Code Online (Sandbox Code Playgroud)
详细信息:Java 6,Apache Commons Collection,IntelliJ 12
更新/答案:事实证明IntelliJ 12支持Java 8,它支持lambdas,并且"折叠"Predicates并将它们显示为lambda.下面是"未折叠"的代码.
return (Collection<Car>) CollectionUtils.select(listOfCars, new Predicate() {
public boolean evaluate(Object arg0) {
return Car.SEDAN == ((Car)arg0).getStyle();
}
});
Run Code Online (Sandbox Code Playgroud) java intellij-idea apache-commons java-8 apache-commons-collection
CollectionUtils :: removeAll()Commons Collections 3.2.1
我一定是要疯了,因为看起来这个方法正在做与文档状态相反的方法:
从集合中删除remove中的元素.也就是说,此方法返回一个集合,其中包含c中未删除的所有元素.
这个小JUnit测试
@Test
public void testCommonsRemoveAll() throws Exception {
String str1 = "foo";
String str2 = "bar";
String str3 = "qux";
List<String> collection = Arrays.asList(str1, str2, str3);
System.out.println("collection: " + collection);
List<String> remove = Arrays.asList(str1);
System.out.println("remove: " + remove);
Collection result = CollectionUtils.removeAll(collection, remove);
System.out.println("result: " + result);
assertEquals(2, result.size());
}
Run Code Online (Sandbox Code Playgroud)
失败了
java.lang.AssertionError:expected:<2>但是:<1>
和打印
collection: [foo, bar, qux]
remove: [foo]
result: [foo]
Run Code Online (Sandbox Code Playgroud)
从我读到的文档我应该期待[bar, qux].我错过了什么?
有可行的通用版本org.apache.commons.collections.CollectionUtils吗?如果没有,为什么不呢?这似乎是一个显而易见的需求.或者Java社区是否放弃了功能编码,直到Java 17中添加了闭包?
我有一个List<Object>,我想返回它找到的第一个与谓词匹配的值.
我发现我可以使用CollectionUtils.find(collection,predicate)(Apache commons).假设它Object包含一个名为:的整数变量value,我如何在谓词中指定该值可以1,2,3,4,5并丢弃那些不匹配的变量.有可能做'包含'.
也没有使用java 8所以无法做流.
将公共集合从3.2.2升级到4.1后,我遇到了比较BeanPredicate和EqualsPredicate集合的问题.BeanPredicate来自commons-beanutils jar,而EqualsPredicate来自commons-collection.jar.
BeanPredicate namePredicate = new BeanPredicate(propertyName, new EqualPredicate("someString"));
Run Code Online (Sandbox Code Playgroud)
根据最新的commons-collection jar 4.1,EqualsPredicate Constructor接受参数化类型
public EqualPredicate(T object)
{
this(object, null);
}
Run Code Online (Sandbox Code Playgroud)
不是3.2.2中的对象
public EqualPredicate(Object object)
{
this.iValue = object;
}
Run Code Online (Sandbox Code Playgroud)
BeanPredicate没有参数化类型,就像<T>它的构造函数那样,为什么我得到编译问题而且无法在这两个谓词之间建立关系.我看到最新的commons-beanUtils 1.9.3 BeanPredicate jar也有BeanPredicate构造函数没有参数化.我尝试给类型,但它不工作.如何解决这个问题任何帮助将不胜感激.
有XXXUtils我可以做的地方
String s = XXXUtils.join(aList, "name", ",");
Run Code Online (Sandbox Code Playgroud)
哪个"name"是来自对象的JavaBeans属性aList.
我发现只有StringUtils具有join的方法,但它只是一个变换List<String>成一个分离String.
就像是
StringUtils.join(BeanUtils.getArrayProperty(aList, "name"), ",")
Run Code Online (Sandbox Code Playgroud)
这很快,值得使用.BeanUtils会抛出2个已检查的异常,所以我不喜欢它.
java apache-commons separator apache-stringutils apache-commons-collection
contains在Java集合上执行null-safe的最佳方法是什么?
换一种说法 -
if (collection != null && collection.contains(x))
Run Code Online (Sandbox Code Playgroud)
?
我希望Apache commons-collections有类似的东西CollectionUtils.contains(collection, x),如果集合为null,就会返回false,因为有size(),像空集合一样处理null.
然而,似乎没有这样的事情 - 我只是想念它吗?
我正在使用Apache Commons Collections创建一个MultiKeyMap,它将存储两个具有一个相应值的键,然后使用MapIterator遍历地图.我遇到的问题是我需要将MapIterator返回的密钥分解回单个密钥而不是单个"复合".虽然我可以分割包含"复合"键的字符串或使用反射,但这些选项似乎都不是很优雅.
为了模拟问题,我创建了以下示例代码
MultiKeyMap multiKeyMap = new MultiKeyMap();
multiKeyMap.put("Key 1A","Key 1B","Value 1");
multiKeyMap.put("Key 2A","Key 2B","Value 2");
multiKeyMap.put("Key 3A","Key 3B","Value 3");
MapIterator it = multiKeyMap.mapIterator();
while (it.hasNext()) {
it.next();
System.out.println(it.getKey());
System.out.println(it.getValue());
}
Run Code Online (Sandbox Code Playgroud)
it.getKey()返回多键[键3A,3B键],但我想要做的就是分配键单个变量,像myKey1 = it.getKey().keys[0]和myKey2 = it.getKey().keys[1],但是我无法找到在JavaDoc任何实现这一目标.
是否可以将MapIterator返回的键分解为各个键而不使用反射或操纵it.getKey()返回的字符串?
在java中假设我有2个列表
List<Object1> list1
List<Object2> list2
object1.getName(); returns a String
object2.getName(); return a String
Run Code Online (Sandbox Code Playgroud)
有没有办法比较名称,并得到两个列表的差异
这些2个对象在第三方库中定义,我不能覆盖equals和compareto方法
我赞成googles Guava或commons集合库
但Sets.symmetricDifference(Set1, Set2)要求传入2,即使我使用Sets.newHashSet(lis1)和Sets.newHashSet(lis2)创建两个集合,但它们仍然在集合中具有不同类型的对象.
或者在公共中CollectionUtils.disjunction(lis1, list2),列表仍然必须包含相同的对象类型
没有做2个昂贵的for循环,还有其他方法吗?