Collections.singletonList()在Java中有什么用?据我所知,它返回一个包含一个元素的列表.为什么我想要一个单独的方法来做到这一点?不变性如何在这里发挥作用?
这个方法有没有特别有用的用例,而不仅仅是一个方便的方法?
说我有一个List,我知道我永远不想添加null它.如果我向它添加null,则意味着我犯了一个错误.因此,每次我打电话,list.add(item)我都会打电话if (item == null) throw SomeException(); else list.add(item);.是否存在List为我这样做的现有类(可能在Apache Commons或其他内容中)?
类似的问题:帮助删除Java列表中的空引用?但我不想删除所有空值,我想确保它们从未被添加到第一位.
考虑以下课程:
import java.util.Objects;
import java.util.function.Predicate;
public class LambdaVsMethodRef {
public static void main(String[] args) {
Predicate<Object> a = Objects::nonNull;
Predicate<Object> b = x -> x != null;
}
}
Run Code Online (Sandbox Code Playgroud)
第一个谓词是从方法引用创建的,另一个是lambda表达式.这些谓词具有相同的行为(nonNull正文是正确的return obj != null;).lambda缩短了两个字符(可能允许流管道适合一行).
除了代码风格,和之间有什么区别?换句话说,我应该更喜欢一个吗?Objects::nonNullx -> x != null
拉姆达-dev的和λ-库-规格- {观察员,专家}邮件列表邮件提isNull,nonNull以及isNotNull(初名)并没有解决这个问题.(我很惊讶没有人质疑添加Objects方法,因为它们可以用lambda轻松替换,但另一方面,也是如此Integer::sum.)
我也查看了字节码javap.唯一的区别是传递给lambda metafactory bootstrap方法的方法句柄:
BootstrapMethods:
0: #16 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
Method arguments:
#17 (Ljava/lang/Object;)Z
#18 invokestatic java/util/Objects.nonNull:(Ljava/lang/Object;)Z
#17 (Ljava/lang/Object;)Z
1: #16 invokestatic …Run Code Online (Sandbox Code Playgroud) Java8在我的JPA EclipseLink 2.5.2环境中继续做一些奇怪的事情.我不得不删除问题/sf/ask/1876432841/ 昨天,因为在这种情况下的排序受到奇怪的JPA行为的影响 - 我通过强迫在进行最终排序之前的第一个排序步骤.
仍然在Java 8中使用JPA Eclipselink 2.5.2,以下代码有时不会在我的环境中排序(Linux,MacOSX,两者都使用build 1.8.0_25-b17).它在JDK 1.7环境中按预期工作.
public List<Document> getDocumentsByModificationDate() {
List<Document> docs=this.getDocuments();
LOGGER.log(Level.INFO,"sorting "+docs.size()+" by modification date");
Comparator<Document> comparator=new ByModificationComparator();
Collections.sort(docs,comparator);
return docs;
}
Run Code Online (Sandbox Code Playgroud)
从JUnit测试调用时,上述函数正常工作.在生产环境中进行debbuging时,我会得到一个日志条目:
INFORMATION: sorting 34 by modification date
Run Code Online (Sandbox Code Playgroud)
但是在TimSort中,nRemaining <2的返回语句被命中 - 因此不会发生排序.JPA提供的IndirectList(请参阅jpa返回的集合?)被认为是空的.
static <T> void sort(T[] a, int lo, int hi, Comparator<? super T> c,
T[] work, int workBase, int workLen) {
assert c != null && a != null && lo >= 0 && lo <= hi …Run Code Online (Sandbox Code Playgroud) 我正在寻找一些优雅的解决方案来从List中删除空值.我发现了以下帖子,其中说我可以使用 list.removeAll(Collections.singletonList(null));
但是,这会抛出UnsupportedOperationException,我假设是因为UnsupportedOperationException它试图对不可变的singleton集合进行一些变异操作.它是否正确?
如果是这种情况,那么singleList的典型用法是什么?要在您确定不想对集合实际执行任何操作时表示大小为1的集合?
提前致谢.