夯实基础(Java基础学习)—Collection和Iterator

目录

  • Collection和Iteration
    • 使用lambda表达式遍历集合
    • 使用foreach循环遍历集合元素
    • 使用Predicate操作集合
    • 使用Stream操作集合

Collection和Iteration

Collection接口是List、Set和Queue接口的父接口,该接口里面定义的方法既可以用于操作Set集合,也可以用于操作List和Queue集合。Collection接口里定义了如下操作集合元素的方法。

  • boolean add(Object o):该方法是向集合里面添加一个元素。如果集合对象被添加操作改变了,则返回true。
  • boolean addAll(Collection c):该方法把集合c里的所有元素添加到指定集合里。如果集合对象被添加操作改变了,则返回true。
  • void clear(): 清除集合里的所有元素,将集合长度变为0。
  • boolean contains(Object o):返回集合里是否包含指定元素
  • boolean containsAll(Collection c ): 判断集合是否包含c的全部元素。
  • boolean isEmpty(): 返回集合是否为空
  • Iterator iterator:返回一个Iterator对象用于遍历集合里面的对象。
  • boolean remove(Object o):删除集合里面的元素,当即和里面包含一个或者两个以上的元素的时候会删除第一个元素,结果返回true
  • boolean removeAll(): 删除集合里面的所有元素,若成功删除一个或者多个元素返回true。
  • boolean retainAll(Collection c):从集合里面删除集合c所不包含的元素(相当于用调用该方法的集合与c取交集),如果该操作改变了调用该方法的集合,则该方法返回true。
  • int size():返回集合里面元素的个数
  • Object[] toArray():该方法把集合转换为一个数组,所有的集合元素变成对应的数组元素。

在传统模式下,把一个对象“丢进”集合中后,集合会忘记这个对象的类型——也就是说,系统自动把所有的集合元素都当作Object类型。从JDK1.5之后,这种状态得到了改进,可以使用泛型来限制集合里的元素类型。

使用lambda表达式遍历集合

Java 8 为 Iterable 接口新增了一个 forEach (Consumer action)默认方法,该方法所需的参数类型是一个函数式集合。而Iteration是collection的父接口,因此collection也可以使用这个方法。

当程序调用这个方法的时候,程序会依次将集合元素传递给Consummer的accept(T t)方法(该接口中唯一的抽象方法)。正因为Consumer是函数式接口,因此可以使用lambda表达式来遍历集合元素,

如下程序示范了使用lambda表达式来遍历集合元素

import java.util.HashSet;

public class CollectionEach{
    public static void main(String[] args){
        HashSet books = new HashSet<>();
        books.add("java 学习");
        books.add("从入门到放弃");
        books.forEach(obj -> System.out.println(obj));
    }
}

输出结果如下

java 学习
从入门到放弃

使用foreach循环遍历集合元素

除可使用Iterator接口迭代访问Collection集合里面的元素之外,使用Java5提供的foreach循环迭代访问集合元素更加便捷。如下程序示范了使用foreach循环来迭代访问集合元素。

import java.util.HashSet;

public class CollectionEach{
    public static void main(String[] args){
        HashSet books = new HashSet<>();
        books.add("java 学习");
        books.add("从入门到放弃");
        for(Object obj : books){
            System.out.println(obj);
        }
    }
}

使用Predicate操作集合

Java 8 为Collection集合新增了一个removeIf(Predicate filter)方法,该方法将会批量删除符合filter条件的元素。该方法需要一个Predicate(谓词)对象作为参数,President也是函数式接口,因此可以使用Lambda表达式作为参数。

如下程序示范了使用Predicate来过滤集合

import java.util.HashSet;

public class CollectionEach{
    public static void main(String[] args){
        HashSet books = new HashSet<>();
        books.add("java 学习");
        books.add("从入门到放弃");
        books.add("123412341234123412");
        books.removeIf(ele -> ((String) ele).length()<10);
        for(Object obj : books){
            System.out.println(obj);
        }
    }
}

输出结果如下

123412341234123412

使用Stream操作集合

Java8还新增了Stream、IntStream、LongStream、DoubleStream等流式API,这些API代表多个支持串行和并行聚集操作的元素。上面四个接口中,Stream是一个通用的流接口,而IntStream、LongStream和DoubleStream则代表了元素类型为Int、Long 、 double的流。

Java 8 还为上面每个流式API提供了对应的Builder,例如 Stream.builder
IntStream.Builder、LongStream.Builder,开发者可以通过这些Builder来创建对应的流。

独立使用Stream的步骤如下:

  1. 使用Stream或者XxxStream的builder()类方法创建该Stream对应的builder。
  2. 重复调用builder的add()方法向该流中添加多个元素。
  3. 调用Builder的builder()方法获取对应的Stream
  4. 调用Stream的聚集方法

在上面的四个步骤当中,第四步可以根据具体需求来调用不同的方法,Stream提供了大量的聚集方阿飞供用户调用,具体可参考Stream或者XxxStream的API文档。

Stream提供了大量的方法进行聚集操作,这样可以获取该流的相关信息。注意:上面粗体字代码每次只能执行一行,因此需要把其他粗体字代码注释掉。

Stream提供大量的方法进行聚集操作,这些方法既可以是“中间的”,也可以是“末端的”

  • 中间方法:中间操作允许流保持打开状态,并允许直接调用后续方法。上面程序当中的map()方法就是中间方法。中间方法的返回值是另一个流。
  • 末端方法: 末端方法是对流的最终操作,当对某个Stream执行末端方法后,该流将会被“消耗”,且不可再被用。上面程序中的sum()、count()、average()等方法都是末端方法。

除此之外,关于流的方法还有如下的两个特征。

  • 有状态的方法: 这种方法会给流增加一些属性,比如元素的唯一性、元素的最大数量、保证元素以排列的方式被处理等。有状态的方法往往需要更大的性能开销
  • 短路方法: 短路放阿飞可以尽早结束对流的操作,不急检查所有的元素

下面简单介绍Stream的常用中间方法

  • filter(Predicate predicate):过滤Stream中所有不符合predicate的元素
  • mapToXxx(ToXxxFunction mapper):使用ToXXXFunction对流中的元素执行一对一的转换,该方法返回的新流中包含了ToXxxFunction转换生成的所有的元素。
  • peek(Consumer action):依次对每个元素执行一些操作,该方法返回的流与原有的流包含相同的元素。该方法主要用于调试。
  • distinct(): 该方法用于排序流中所有重复的元素(判断元素重复的标准是使用equals()比较返回为true)。这是一个有状态的方法。
  • sorted(): 该方法用于保证流中的元素在后续访问过程当中处于有序状态。这是一个有状态的方法。
  • limit(long maxSize): 该方法用于保证对该流的后续访问中最大允许访问的元素个数。这是一个有状态的、短路方法

下面简单介绍一下Stream常用的末端方法。

  • forEach(Consumer action): 遍历流中的所有元素,对每个元素执行action
  • toArray():将流中的所有元素转为一个数组。
  • reduce(): 该方法有三个重载版本,都用于通过某种操作来合并流中的元素。
  • min():返回流中的最小元素值
  • max() : 返回流中的最大元素值
  • count(): 返回流中所有元素的数量
  • anyMatch(Predicate predicate): 判断流中是否至少存在一个元素符合Predicate条件。
  • allMatch(Predicate predicate): 判断流中是否所有元素都包含了Predicate条件
  • noneMatch(Predicate predicate): 判断流中是否所有元素都不符合Predicate条件。
  • findFirst(): 返回流中的第一个元素
  • findAny(): 返回流中的第一个元素。

除此之外,Java8允许使用流失API来操作集合,Collection接口提供了一个stream()默认方法,该方法可以返回该集合对应的流,接下来即可通过流失API来操作集合元素。由于Stream可以对集合元素进行整体的聚集操作,因此Stream极大的丰富了集合的功能。

你可能感兴趣的:(夯实基础(Java基础学习)—Collection和Iterator)