我有一个"SomeClass"列表,它可能包含很多功能相同的对象,我需要对它们进行分组.具有相同getName(),getInputDate(),getOutputDate()和getValue()的条目应组合在一起.我遇到了Multimap,这似乎是我需要的东西,但我无法想出如何将这些分组的优雅方式.
目前我已经将它们全部用作Multimap的关键,但我不认为这是最好的解决方案..
private ImmutableListMultimap<String, SomeClass> getGrouped() {
return Multimaps.index
(someClassList, new Function<SomeClass, String>() {
public String apply(SomeClass someClass) {
return someClass.getName() + someClass.getInputDate() + someClass
.getOutputDate() + someClass.getValue();
}
});
}
Run Code Online (Sandbox Code Playgroud) analyticsDatabases的类型 -
private final Iterable<Database> analyticsDatabases;
Run Code Online (Sandbox Code Playgroud)
我在方法中使用下面的代码片段,并且我在analyticsDatabases List中有一个元素.当我做一个for循环时,一切正常,但我很好奇为什么我的Iterables.transform不起作用.
Iterable<Iterable<ObjectId>> finalR = Iterables.transform(analyticsDatabases, new Function<Database, Iterable<ObjectId>>() {
@Nullable
@Override
public Iterable<ObjectId> apply(@Nullable Database database) {
if (database != null) {
return database.deleteItemsById(filterIds, storableType, writeAckStrategy);
}
`enter code here`
return null;
}
});
Run Code Online (Sandbox Code Playgroud) 我想知道为什么Guavas Ordering在以下代码中无法正常工作:
public static void main(String[] args) {
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
System.out.println(Ordering.natural().isOrdered(integers));
List<String> strings = Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10");
System.out.println(Ordering.natural().isOrdered(strings));
List<String> strings2 = Arrays.asList("6417", "6418", "6419", "6420");
System.out.println(Ordering.natural().isOrdered(strings2));
}
Run Code Online (Sandbox Code Playgroud)
输出:
true
false
true
Run Code Online (Sandbox Code Playgroud)
我预计会看到true3次.
有人可以解释为什么没有按预期排序吗?
我用来HashMap存储斐波那契值.
以下是此代码执行的输出:
Enter n: 500000
F(500000) = 2955561408 ... computed in 5,141 ms
Enter n: 500000
F(500000) = 2955561408 ... computed in 0 ms
Run Code Online (Sandbox Code Playgroud)
它缓存得很好,返回结果很好
我想更好地替换它Guava cache,我已经失去了任何利润.代码执行输出:
Enter n: 500000
F(500000) = 2955561408 ... computed in 5,184 ms
Enter n: 500000
F(500000) = 2955561408 ... computed in 5,086 ms
Run Code Online (Sandbox Code Playgroud)
这是程序代码:
public class CachedFibonacci {
private static Map<BigDecimal, BigDecimal> previousValuesHolder;
static {
previousValuesHolder = new HashMap<>();
previousValuesHolder.put(BigDecimal.ZERO, BigDecimal.ZERO);
previousValuesHolder.put(BigDecimal.ONE, BigDecimal.ONE);
}
private static LoadingCache<BigDecimal, BigDecimal> cachedFibonacci = …Run Code Online (Sandbox Code Playgroud) 我试图用番石榴的集合来创建地图,将一个类实例存储的密钥和一个整数作为值.所以像这样:
核心价值
FooOne - 1
FooTwo - 2
FooThree - 3
FooFour - 4
Run Code Online (Sandbox Code Playgroud)
我现在在代码中有这个:
private ClassToInstanceMap<Object> classRanking = MutableClassToInstanceMap.create();
classRanking.put(FooOne.class, 0);
classRanking.put(FooTwo.class, 1);
classRanking.put(FooThree.class, 2);
classRanking.put(FooFour.class, 3);
Run Code Online (Sandbox Code Playgroud)
但是在运行时会抛出错误:
java.lang.ClassCastException: Cannot cast java.lang.Integer to com.jer.abc.test.FooOne
at java.lang.Class.cast(Unknown Source)
at com.google.common.collect.MutableClassToInstanceMap.cast(MutableClassToInstanceMap.java:82)
at com.google.common.collect.MutableClassToInstanceMap.access$000(MutableClassToInstanceMap.java:36)
at com.google.common.collect.MutableClassToInstanceMap$1.checkKeyValue(MutableClassToInstanceMap.java:67)
at com.google.common.collect.MutableClassToInstanceMap$1.checkKeyValue(MutableClassToInstanceMap.java:64)
at com.google.common.collect.MapConstraints$ConstrainedMap.put(MapConstraints.java:313)
at com.fmr.gps.web.support.PortfolioInsightsSupport.populateRankingMap(PortfolioInsightsSupport.java:33)
at com.fmr.gps.web.support.PortfolioInsightsSupport.<init>(PortfolioInsightsSupport.java:29)
at com.fmr.gps.web.PortfolioInsightsSupportTest.setUp(PortfolioInsightsSupportTest.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) …Run Code Online (Sandbox Code Playgroud) 我想尝试做以下事情:
private static final ImmutableMap<String, List<?>> lists = ImmutableMap.of(
"A", new ArrayList<String>(),
"B", new ArrayList<Integer>());
Run Code Online (Sandbox Code Playgroud)
本质上,我试图捕获的主要区别是不同的值具有不同的类型参数.但是这会给出错误:
Type mismatch: cannot convert from
ImmutableMap<String,ArrayList<? extends Object&Serializable&Comparable<?>>>
to ImmutableMap<String,List<?>>
Run Code Online (Sandbox Code Playgroud)
是否有更好的方法来解决这个问题?
嗨,我是谷歌番石榴收藏品的新手,所以我需要收集,这将在一段时间内到期.所以我写了下面的代码,但它没有在过期时删除数据.任何人都可以告诉我代码的问题是什么.
Cache<String, Object> cache = CacheBuilder.newBuilder()
.expireAfterAccess(2, TimeUnit.MILLISECONDS)
.build();
Object object = new Object();
cache.put(object.getId(), object);
System.out.println("size :" + cache.size());
Thread.sleep(50000);
System.out.println("After Size :" + cache.size());
Run Code Online (Sandbox Code Playgroud)
我需要添加对象来映射,并且在到期时间之后它将从map中删除.但是在线程包含对象的地图之前和之后的代码.
我正在寻找一个Scala(或Java/Guava)集合,它支持O(1)访问(并理想地删除)其最小元素以及O(log n)插入和删除任意元素.
思考?
在处理转换时(例如:transform List<People> peopleto List<Integer> ages,where People是包含属性的类age),通常有两种方法(对我而言):
使用java8:
people.stream().map(p -> p.getAge()).collect(toList());
或用户guava2:
Lists2.transform(people, People2AgeTransformer.INSTANCE);其中People2AgeTransformer是一个变换器,它实现了Function接口以返回年龄.
最近,我偶然发现java8和guava可以合并,因此代码可以是:
Lists2.transform(people, p->p.getAge());
Run Code Online (Sandbox Code Playgroud)
这段代码符合并运行没有任何错误,这让我感到困惑.该方法Lists2.transform()要求第二个args是接口的实现com.google.common.base.Function,而java8 lambda实际上是接口的实现java.util.function.Function.(好吧,它们都声明了一个B apply(A input)将A转换为B 的方法.)
我不明白为什么这会起作用,因为它们是不同包的两个不同界面.
我有以下代码:
private static final ImmutableMultimap<String, String> namesToAddress;
public static List<String> getAddresses(String name){
return ImmutableList.copyOf(namesToAddress.get(name));
}
Run Code Online (Sandbox Code Playgroud)
我的问题是防御性copyOf()在这里是必要的,因为get()仍然返回一个不可变列表?
注意我正在使用Google Guava的ImmutableMultiimap.
谢谢.
guava ×10
java ×9
collections ×3
dictionary ×2
caching ×1
class ×1
generics ×1
immutability ×1
instance ×1
java-stream ×1
lambda ×1
scala ×1
sorting ×1
string ×1