List<String> list = new ArrayList<String>();
list.add("One");
list.add(null);
list.add("Two!");
list.add(null);
list.add("Three");
list.add(null);
list.add("Four");
list.add(null);
我有一个包含 null 元素的列表。有没有办法在不使用任何迭代的情况下从当前集合中删除 null 元素?
答案 0 :(得分:50)
这应该有效:
list.removeAll(Collections.singleton(null));
答案 1 :(得分:8)
在java 8中,您可以使用Collection.removeIf
:
list.removeIf(Objects::isNull);
答案 2 :(得分:5)
扩展ArrayList
并覆盖add()
&amp; addAll()
方法只是不允许null
或者您可以使用list.removeAll(null);
,如here 内部迭代循环
答案 3 :(得分:3)
看看LambdaJ,它允许你“无”循环操作集合。实际上循环是在库中实现的,但它非常酷,它简化了代码并缩短了代码。
答案 4 :(得分:2)
效率不高,但有效
while(list.remove(null));
答案 5 :(得分:1)
当前答案无法区分可变列表和不可变列表,我发现很多遗漏方式。尽管java-9传递了一个List.of(..)
元素,但cannot以来引入的null
变得更加重要。无论如何,删除都是相关的(例如删除某个非null元素)。
不可变列表
不可变列表的一个示例是Arrays.asList(..)
(但是元素仍然可以替换,但是不能添加/删除)或已经提到过List.of(..)
。只要不能使用List
方法添加/删除元素,这些就被视为“不可变包装器”。
List<String> immutableList = Arrays.asList("one", null, "two");
Stream#filter(Predicate)
方法从java-stream开始的List<String> newList = immutableList.stream()
.filter(Objects::nonNull)
.collect(Collectors.toList());
带索引或增强索引的逐个循环适用于Java版本java-7及更低版本(不仅适用)。
// note we need to create a mutable List to add the non-null elements
List<String> newList = new ArrayList<>();
for (String str: immutableList) {
if (str != null) {
newList.add(str);
}
}
可变列表
可变列表的一个示例是List
接口的新实例,例如new ArrayList<>()
或new LinkedList<>()
。它们是易变的,因此可以使用List#add
或List#addAll
添加元素,并且是一种常用的方法。
List<String> mutableList = new ArrayList<>(Arrays.asList("one", null, "two"));
以下列出了从此类null
中删除所有List
元素的方法。请注意,它修改了列表。
答案 6 :(得分:0)
如果您自己构建列表并且不确定该值是否为null,则还可以使用CollectionUtils.addIgnoreNull(list,elementToAdd);
这将阻止添加空元素。这仅在构造列表时有效。如果您从其他地方收到列表并希望在使用列表之前删除所有非null元素,那么list.removeAll(Collections.singleton(null));
将是最好的
答案 7 :(得分:0)
for (int i = 0; i <array.size(); i++) {
for (int j = 0; j < array.size()-i-1; j++) {
if (array.get(j) > array.get(j+i)){
Integer t = array.get(j+i);
array.set(j+i,array.get(j));
array.set(j,t);
}
}
}
for(int i = array.size()-1; i >= 0; i--){
它是一个升序,这个问题的降序是什么?
答案 8 :(得分:0)
使用google.common.
:
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
public List<String> removeBlanks(List<String> list) {
return Lists.newArrayList(Iterables.filter(list, new Predicate<String>() {
@Override
public boolean apply(String arg) {
return StringUtils.isNotEmpty(arg);
}
}));
}