ArrayIterator很方便(虽然我不需要这个reset功能),但是像其他的Commons Collections一样,它不使用泛型.我检查过Google Collections,但我没有看到相近的等价物.我错过了吗?是否有另外一个具有类似声誉和质量的图书馆,前两个图书馆提供这样的东西?谢谢.
我知道,奇怪的标题让我解释一下.
我是最熟悉C#和Javascript的开发人员.我完全沉浸在那些半功能的世界中,以至于我的大多数代码都是关于映射/缩减/过滤集合.在C#中,这意味着我几乎无处不在地使用LINQ,在Javascript中它是Underscore.js和jQuery.
我目前被分配到一个正在进行的Java项目,我感到相当窒息.我根本就没有想到"创建一个数组,从一个到另一个地方改变东西".我可以(并且确实)使用实现接口的匿名类型创建我自己的主map/reduce函数版本,但为什么要重新发明轮子?我目前正在进行的项目已经有了commons-collections-3.1.jar,并且查看了包含它的类似乎可能可以完成我想要的所有内容.
对于我的生活,我找不到如何实际使用它.浏览其中的几十个课程并不是很有帮助,我唯一可以谷歌的是api doc,它同样有用.
你如何使用它来映射/选择,过滤/在哪里,减少/聚合?有没有在这个库上提供实际教程的地方?
我想创建一个
public static final LinkedMap myMap;
Run Code Online (Sandbox Code Playgroud)
在某个地方,我发现了类似地图的地图:
public class Test {
private static final Map<Integer, String> MY_MAP = createMap();
private static Map<Integer, String> createMap() {
Map<Integer, String> result = new HashMap<Integer, String>();
result.put(1, "one");
result.put(2, "two");
return Collections.unmodifiableMap(result);
}
}
Run Code Online (Sandbox Code Playgroud)
但我不能将'unmodifiableMap'方法应用于它LinkedMap.有谁能够帮我?有可能吗?
是否有一个单行(可能来自Guava或Apache Collections)从一组中获取子列表.在内部它应该做这样的事情:
public <T> List<T> sublist(Set<T> set, int count) {
Iterator<T> iterator = set.iterator();
List<T> sublist = new LinkedList<T>();
int pos = 0;
while (iterator.hasNext() && pos++ < count) {
sublist.add(iterator.next());
}
return sublist;
}
Run Code Online (Sandbox Code Playgroud)
显然,如果没有足够的元素,它必须尽可能多地返回.
Apache Commons Collections库的4.0版本增加了泛型支持.我无法转换代码以利用它:
我想要一个MultiValueMap以字符串作为键,以及字符串的集合作为值.但:
LinkedHashMap)LinkedHashSet).我能得到的最接近的是:
MultiValueMap<String, String> orderedMap = MultiValueMap.multiValueMap(
new LinkedHashMap<String, Collection<String>>(),
LinkedHashSet.class
);
Run Code Online (Sandbox Code Playgroud)
但是这会产生错误:
multiValueMap(Map<K,? super C>, Class<C>)类型中 的方法MultiValueMap不适用于参数(LinkedHashMap<String,Collection<String>>, Class<LinkedHashSet>)
所以现在我在仿制药地狱.任何建议都是最受欢迎的.
在4.0版之前,我通过以下方式实现了这一目标:
MultiValueMap orderedMap = MultiValueMap.decorate(
new LinkedHashMap<>(),
LinkedHashSet.class
);
Run Code Online (Sandbox Code Playgroud)
简单!我提供了LinkedHashMap使用MultiValueMap行为进行装饰,并指定LinkedHashSet要用作值的collection()的类型.但是,这需要铸造,当我打电话put()和get(),所以我希望能够使用4.0提供的新的通用版本.
在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循环,还有其他方法吗?
我正在使用提供多键值对的commons-collections中的MultiKeyMap.我有3个键是字符串.我有两个问题,我看不出如何解决.
如何迭代所有多键值对?使用简单的HashMap,我知道它.
其次,如何修复前两个键的所有多键值对?这意味着我想得到这样的东西,multiKey.get("key1","key2",?);其中没有指定第三个键.
MyObject我想根据字段过滤列表values。在这种情况下:如果 on 的任何值MyObject::getValues小于给定value,则谓词为 false。我还没有找到使用 Stream API 的方法,所以我尝试ComparatorPredicate了Apache. 这是我的尝试:
private Predicate<MyObject> valueGreaterThanOrEqualTo(ValueObject value){
return myObject -> myObject.getValues().stream()
.noneMatch(v -> ComparatorPredicate.comparatorPredicate(value, new ValueComparator(), ComparatorPredicate.Criterion.LESS)
.evaluate(v));
}
Run Code Online (Sandbox Code Playgroud)
然而,这会导致:
Caused by: java.lang.ClassCastException: Cannot cast java.lang.Boolean to com.ValueObject
at java.lang.Class.cast(Class.java:3369)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1351)
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230)
at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.noneMatch(ReferencePipeline.java:459)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是为什么会发生 ClassCastException 以及如何解决它和/或如何使用其他(更好的?)解决方案解决我的问题?
更新: …
java predicate comparator apache-commons-collection java-stream
我正在查看各种google-collections(或者也就是Apache commons集合)类,我希望在为我的用例找到最合适的Map实现方面有所帮助.我对本土地图不感兴趣.
以下是一些要求:
Map<String, List<String>>数据结构(A)Map<String, String>只读视图(B).B.get(X) == A.get(X).get(A.get(X).size() - 1)我知道ArrayListMultimap,但它没有公开满足我对(B)要求的观点.
有什么指针吗?
我正在寻找类似的东西ConcurrentLinkedQueue,但有以下行为:
peek()/ poll()队列中,它检索HEAD,也不会删除它,并且随后前进HEAD一个节点向TAILpeek()/时poll(),HEAD重置为其原始节点(因此为"循环"行为)所以,如果我像这样创建队列:
MysteryQueue<String> queue = new MysteryQueue<String>();
queue.add("A"); // The "original" HEAD
queue.add("B");
queue.add("C");
queue.add("D"); // TAIL
String str1 = queue.peek(); // Should be "A"
String str2 = queue.peek(); // Should be "B"
String str3 = queue.peek(); // Should be "C"
String str4 = queue.peek(); // Should be "D"
String str5 = queue.peek(); // Should be "A" again
Run Code Online (Sandbox Code Playgroud)
以这种方式,我可以整天偷看/轮询,队列将一遍又一遍地滚动我的队列.
JRE是否附带这样的东西?如果没有,可能是Apache Commons Collections或其他第三方库中的某些东西?提前致谢!
java queue collections circular-buffer apache-commons-collection
java ×10
guava ×4
collections ×2
arrays ×1
comparator ×1
dictionary ×1
final ×1
generics ×1
java-stream ×1
map ×1
mapreduce ×1
multikey ×1
predicate ×1
queue ×1