想象一下,我有一些特定对象的列表:
List<Student>
Run Code Online (Sandbox Code Playgroud)
我需要生成包含另一个列表ids的Students在上面的列表:
List<Integer>
Run Code Online (Sandbox Code Playgroud)
避免使用循环,是否可以通过使用apache集合或番石榴来实现这一点?
哪种方法对我的情况有用?
我正在为该类编写一个简单的JUnit测试MyObject.
阿MyObject可以从静态工厂方法,该方法的可变参数来创建字符串.
MyObject.ofComponents("Uno", "Dos", "Tres");
Run Code Online (Sandbox Code Playgroud)
在存在期间的任何时候MyObject,客户端都可以通过该方法以List <E>的形式检查它所创建的参数.getComponents().
myObject.ofComponents(); // -> List<String>: { "Uno", "Dos", "Tres" }
Run Code Online (Sandbox Code Playgroud)
换句话说,MyObject两者都会记住并公开使其存在的参数列表.关于这份合同的更多细节:
getComponents将与为对象创建选择的顺序相同null是未定义的(其他代码保证没有null到达工厂)我正在编写一个简单的测试,它MyObject从String列表中创建一个并检查它是否可以返回相同的列表.getComponents().我立即这样做,但这应该发生在一个真实的代码路径中的距离.
在这里我的尝试:
List<String> argumentComponents = Lists.newArrayList("One", "Two", "Three");
List<String> returnedComponents =
MyObject.ofComponents(
argumentComponents.toArray(new String[argumentComponents.size()]))
.getComponents();
assertTrue(Iterables.elementsEqual(argumentComponents, returnedComponents));
Run Code Online (Sandbox Code Playgroud)
Iterables.elementsEqual()最好的办法,只要我有库在我的构建路径,那些两个列表比较?这是我一直在苦恼的事情; 我应该使用这个辅助方法,它超过了 …高度重复的代码通常是一件坏事,并且有一些设计模式可以帮助减少这种情况.然而,由于语言本身的限制,有时它是不可避免的.以下示例来自java.util.Arrays:
/**
* Assigns the specified long value to each element of the specified
* range of the specified array of longs. The range to be filled
* extends from index <tt>fromIndex</tt>, inclusive, to index
* <tt>toIndex</tt>, exclusive. (If <tt>fromIndex==toIndex</tt>, the
* range to be filled is empty.)
*
* @param a the array to be filled
* @param fromIndex the index of the first element (inclusive) to be
* filled with the specified value
* @param toIndex …Run Code Online (Sandbox Code Playgroud) 创建List字符串的最佳构造是什么?是Lists.newArrayList()(来自番石榴)还是new ArrayList()?
这只是个人偏好吗?
或者只是键入泛型类型推断?
或者使用Lists.newArrayList()是否有任何理论或实践价值?
更新我的依赖版本后AndroidStudio3.1,我开始收到以下错误:
Information:Gradle tasks [:app:assembleDebug]
Error:com.android.builder.dexing.DexArchiveBuilderException: Failed to process C:\Users\Blabla\.gradle\caches\modules-2\files-2.1\com.google.guava\guava\21.0\3a3d111be1be1b745edfa7d91678a12d7ed38709\guava-21.0.jar
Error:com.android.builder.dexing.DexArchiveBuilderException: Error while dexing.
Error:com.android.tools.r8.ApiLevelException: Default interface methods are only supported starting with Android N (--min-api 24): java.util.Collection com.google.common.collect.BiMap.values()
Error:Execution failed for task ':app:transformClassesWithDexBuilderForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.dexing.DexArchiveBuilderException: com.android.builder.dexing.DexArchiveBuilderException: Failed to process C:\Users\Blabla\.gradle\caches\modules-2\files-2.1\com.google.guava\guava\21.0\3a3d111be1be1b745edfa7d91678a12d7ed38709\guava-21.0.jar
Information:BUILD FAILED in 6s
Information:4 errors
Information:0 warnings
Information:See complete output in console
Run Code Online (Sandbox Code Playgroud)
我已经清理并重建了项目.检查了我的"multiDexEnabled true"''编译'com.android.support:multidex:1.0.2'已添加.
我还可以做些什么?
编辑:添加build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
buildToolsVersion '26.0.2'
defaultConfig {
applicationId "com.blabla"
minSdkVersion 19
targetSdkVersion …Run Code Online (Sandbox Code Playgroud) 我是Guava的新手(说实话,我不是"非常新的",我是这个主题的新手)所以我决定阅读一些文档并在阅读时非常惊讶:
com.google.common.base.Preconditions.checkNotNull(...)
我不明白这个方法的意义.这意味着,而不是做:
myObject.getAnything();
Run Code Online (Sandbox Code Playgroud)
(这可能导致NullPointerExceptionif myObject为null)
我应该用
checkNotNull(myObject).getAnything();
Run Code Online (Sandbox Code Playgroud)
这将抛出NullPointerException如果myObject是空和返回myObject,如果它不为空.
我很困惑,这可能是有史以来最愚蠢的问题,但......
这有什么意义?考虑到我能想到的任何情况,这两行与结果完全相同.
我甚至认为后者更具可读性.
所以我一定错过了什么.它是什么?
我正在寻找java.util.Queue的实现或Google集合中表现得像Queue的东西,但也要确保队列中的每个元素都是唯一的.(所有进一步插入都没有效果)
这是可能的,还是我必须手工完成?
现在我正在使用一个带有LinkedList实现的Queue,并在插入之前检查唯一性.(我使用侧面Map来执行此操作,在队列之前/之后添加/删除侧面图中的元素).我不太喜欢它.
欢迎任何输入.如果它不在java.util包中,那么也许这是一个坏主意?
可选用于表示可为空的对象,此类的一些用途包括
对于第一种情况,我是否需要在所有可空的返回方法中返回Optional?
在使用Google Collections(更新:Guava)时,我有一个关于简化某些Collection处理代码的问题.
我有一堆"计算机"对象,我想最终收集他们的"资源ID".这样做是这样的:
Collection<Computer> matchingComputers = findComputers();
Collection<String> resourceIds =
Lists.newArrayList(Iterables.transform(matchingComputers, new Function<Computer, String>() {
public String apply(Computer from) {
return from.getResourceId();
}
}));
Run Code Online (Sandbox Code Playgroud)
现在,getResourceId()可能会返回null(并且现在更改它不是一个选项),但在这种情况下,我想从结果String集合中省略null.
这是过滤掉空值的一种方法:
Collections2.filter(resourceIds, new Predicate<String>() {
@Override
public boolean apply(String input) {
return input != null;
}
});
Run Code Online (Sandbox Code Playgroud)
你可以像这样把所有这些放在一起:
Collection<String> resourceIds = Collections2.filter(
Lists.newArrayList(Iterables.transform(matchingComputers, new Function<Computer, String>() {
public String apply(Computer from) {
return from.getResourceId();
}
})), new Predicate<String>() {
@Override
public boolean apply(String input) {
return input != null; …Run Code Online (Sandbox Code Playgroud) 如果传递的对象引用是,那么Guava是否提供了获取默认值的方法null?我正在寻找类似的东西<T> T nullToDefault(T obj, T default),如果obj是,则返回默认值.null
在stackoverflow上,我一无所获.我只是在寻找纯粹的番石榴解决方案(如果有的话)!
我在Gauva 10 API中找不到任何东西,只com.google.common.base.Objects看起来很有希望,但缺少类似的东西.
guava ×10
java ×9
collections ×3
android ×1
generics ×1
java-8 ×1
java-stream ×1
junit ×1
list ×1
maintenance ×1
null ×1
optional ×1
preprocessor ×1
queue ×1
refactoring ×1