Java # The Collection Interface

1. 集合接口

The Collection Interface

Collection代表一组称为其元素的对象。该Collection接口用于传递需要最大通用性的对象集合。例如,按照惯例,所有通用集合实现都有一个带有Collection参数的构造函数。此构造函数称为转换构造函数,它初始化新集合以包含指定集合中的所有元素,无论给定集合的子接口或实现类型如何。换句话说,它允许您转换集合的类型。

例如,假设您有 一个 Collection c,它可能是 List、 aSet或其他类型的Collection。习惯用法创建一个新的ArrayList(接口的实现List),最初包含c.

List<String> list = new ArrayList<String>(c);
// or — if you are using JDK 7 or later — you can use the diamond operator:
List<String> list = new ArrayList<>(c);

该Collection接口包含执行基本操作的方法,例如 int size()、boolean isEmpty()、 boolean contains(Object element)、boolean add(E element)、boolean remove(Object element)和 Iterator< E > iterator()
它还包含对整个集合进行操作的方法,例如 boolean containsAll(Collection<?> c)、 boolean addAll(Collection<? extends E> c)、 boolean removeAll(Collection<?> c)、boolean retainAll(Collection<?> c)和 void clear()

2. 遍历集合

Traversing Collections

遍历集合有三种方法:

  1. 使用聚合操作
  2. 使用for-each构造函数
  3. 使用Iterators

3. 聚合运算

Aggregate Operations

在 JDK 8 及更高版本中,迭代集合的首选方法是获取流(stream)并对其执行聚合操作。聚合运算通常与 lambda 表达式结合使用,以使用更少的代码行使编程更具表现力。以下代码按顺序迭代形状集合并打印出红色对象:

myShapesCollection.stream()
.filter(e -> e.getColor() == Color.RED)
.forEach(e -> System.out.println(e.getName()));

有许多不同的方法可以使用此 API 收集数据。下面的例子将很形象的表达聚合运算的作用,小编认为比较实用:

  • 例如,您可能希望将 a 的元素转换Collection为String对象,然后将它们连接起来,并用逗号分隔:
    String join = elements.stream() 
    .map(Object::toString) 
    .collect(Collectors.joining(", "));
  • 或者也许将所有员工的工资相加:
int Total =Employees.stream() 
.collect(Collectors.summingInt(Employee::getSalary)));

这些只是您可以使用流和聚合操作执行的操作的几个示例。有关更多信息和示例,请参阅聚合操作

for-each 构造

for-each构造允许您使用for循环简洁地遍历集合或数组 - 请参阅 for 语句。以下代码使用该for-each构造在单独的行上打印出集合的每个元素。

for (Object o : collection) 
    System.out.println(o);

迭代器

Iterators

一个Iterator是一个对象,使您能够遍历集合并根据需要有选择地从集合中删除元素。如果需要,您可以通过调用集合的iterator方法来获取集合的Iterator ,下面是Iterator Interface

public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove(); //optional
}

hasNext 方法返回 true, 如果迭代有更多元素,而且next方法返回迭代里的下一个元素;remove方法删除最后一个元素,该元素是由next方法从Collection 底层返回的最后一个元素,remove方法每次调用只能调用一次,如果违反此规则,则抛出异常: truenextremovenextCollectionremovenext
请注意,Iterator.remove是在迭代期间修改集合的唯一安全方法
以下情况,使用Iterator而不是for-each:

  • 删除当前元素。for-each构造隐藏了迭代器,因此您无法调用remove,因此,for-each不可用于过滤。
  • 并行迭代多个集合。

以下方法向您展示如何使用 anIterator来过滤任意元素Collection- 即遍历集合并删除特定元素:

//这段简单的代码是多态的,这意味着它适用于任何 Collection实现
static void filter(Collection<?> c) { 
    for (Iterator<?> it = c.iterator(); it.hasNext(); ) 
        if (!cond(it.next())) 
            it.remove(); } 
}

集合接口批量操作

Collection Interface Bulk Operations

对整个Collection批量操作 (Bulk operations).您可以使用基本操作来实现这些简写操作,但在大多数情况下,此类实现的效率较低。以下为批量操作:

  • containsAll—返回 true,如果目标Collection 包含指定 Collection 中的所有元素
  • addAll—将所有指定Collection里的元素添加到目标Colletion中
  • removeAll—删除目标Colletion里的所有与指定Colletion共有的元素
  • retainAll—删除目标Colletion中的所有元素,只保留目标Colletion与指定Colletion共有的元素
  • clear—删除Collection里的所有元素
    如果目标Collection在操作执行过程中被修改,那么addAll, removeAll, retainAll 方法都将返回 true

集合接口数组操作

Collection Interface Array Operations

toArray 方法提供了一个 colletions 和旧的 API 之间的桥梁,用于输入得到一个数组。
例如,有个集合 c,下面的代码将c 里的元素(elements)转存到一个新的array对象里,且array的场电影和c中elements的个数一样。

Object[] a = c.toArray();

欢迎阅读,以及欢迎指出不足之处,如果点赞就更好了;
祝您学习愉快~😊😊😊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值