我试着像那样绕圈

// ArrayList tourists

for (Tourist t : tourists) {
    if (t != null) {     
        t.setId(idForm); 
    }   
}

但这并不好。谁能给我一个更好的解决办法?


一些有用的基准可以帮助你做出更好的决定:

While循环,For循环和迭代器性能测试


当前回答

有一种简单的方法可以从集合中删除所有空值。必须将包含null的集合作为参数传递给removeAll()方法

List s1=new ArrayList();
s1.add(null);

yourCollection.removeAll(s1);

其他回答

 for (Iterator<Tourist> itr = tourists.iterator(); itr.hasNext();) {
      if (itr.next() == null) { itr.remove(); }
 }

Try:

tourists.removeAll(Collections.singleton(null));

阅读Java API。代码将为不可变列表抛出java.lang.UnsupportedOperationException(例如使用Arrays.asList创建的列表);更多细节请看这个答案。

我使用了流接口、流操作collect和一个helper方法来生成一个新列表。

tourists.stream().filter(this::isNotNull).collect(Collectors.toList());

private <T> boolean isNotNull(final T item) {
    return  item != null;
}

Objects类有一个非空谓词,可以与过滤器一起使用。

例如:

tourists.stream().filter(Objects::nonNull).collect(Collectors.toList());
list.removeAll(Collections.singleton(null));

如果你在数组上使用它,它会抛出UnsupportedException。asList因为它给了你不可变的副本,所以它不能被修改。请参阅下面的代码。它创建可变副本,不会抛出任何异常。

public static String[] clean(final String[] v) {
    List<String> list = new ArrayList<String>(Arrays.asList(v));
    list.removeAll(Collections.singleton(null));
    return list.toArray(new String[list.size()]);
}