zoukankan      html  css  js  c++  java
  • java集合 之 Collection和Iterator接口

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

    boolean add(object o):该方法用于向一个集合中里添加一个元素。如果集合对象被添加操作改变了,则返回true。

    boolean addAll(Collection c):将集合c中的所有元素添加到指定的集合中。如果集合对象被添加操作改变了,则返回true。

    void clear():清除集合里的所有元素,将集合长度变为0。

    boolean contatins(Objeect o):返回集合中是否包含指定元素o。如果包含,返回true。

    boolean containsAll(Collection c):返回集合中是否包含集合c中的所有元素。如果包含,返回true。

    boolean isEmpty():返回集合是否为空。当集合长度为零时,返回true;否则返回false。

    Iterator iterator():返回一个Iterator对象,用于遍历集合中的元素。

    boolean remove(Object o):删除集合中的指定元素o,当集合中包含多个o元素时,只删除第一个符合条件的o元素,该方法返回true。

    boolean removeAll(Collection c):删除集合中所有集合c包含的元素(相当于当前集合减去集合c),如果该方法改变了调用该方法的集合,则该方法返回true。

    boolean retainAll(Collection c):删除集合中所有集合c不包含的元素(相当于求当前集合于集合c的交集),如果该方法改变了调用了该方法的集合,则该方法返回true。

    int size():返回集合的长度。

    Object[] toArray():将集合转换为一个数组,所有集合元素变成相应的数组元素。

    public class CollectionTest {
    
        public static void main(String[] args){
            Collection c = new ArrayList();
            //添加元素
            c.add("孙悟空");
            c.add(6);
            System.out.println("c集合中的元素个数为:" + c.size());
            //删除元素
            c.remove(6);
            System.out.println("c集合中的元素个数为:" + c.size());
            System.out.println("c集合中是否包含‘孙悟空’:" + c.contains("孙悟空"));
            c.add("轻量级java应用开发");
            System.out.println("c集合中的元素为:" + c);
            Collection books = new HashSet();
            books.add("轻量级java应用开发"); books.add("疯狂java讲义");
            System.out.println("c集合是否完全包括集合books:" + c.containsAll(books));
            c.removeAll(books);
            System.out.println("c集合中的元素为:" + c);
            //清空集合c
            c.clear();
            System.out.println("c集合中的元素为:" + c);
            books.retainAll(c);
            System.out.println("books集合中的元素为:" + books);
        }
    }

    使用Lambda表达式遍历集合:

    java8为Iterble接口新增了了一个foreach(Consumer action)接口,该方法所需的参数类型是一个函数式接口,而Iterable是Collection接口的父接口,应此Collection可以直接调用此方法。

    当程序调用Iterable的foreach(Consumer action)遍历集合元素时,程序会依次将集合元素传给Comsumer的accept(T t)方法(该方法中唯一的抽象方法)。

    public class CollectionEach {
    
        public static void main(String[] args){
            Collection books = new HashSet();
            books.add("轻量级java企业应用开发");
            books.add("疯狂java讲义");
            books.add("疯狂android");
            /*输出:迭代集合为:疯狂java讲义
                   迭代集合为:轻量级java企业应用开发
                   迭代集合为:疯狂android*/
            books.forEach(obj -> System.out.println("迭代集合为:" + obj));
        }
    }

    使用java8增强的Ieteraor遍历集合元素:

    Iteraor接口也是java集合框架中的成员,主要用于遍历Collection集合中的元素,Iterator对象也被称为迭代器。

    Iteraor定义了一些方法:

    boolean hasnext(): 如果被迭代的元素还没有遍历完,则返回true。

    Object next(): 返回集合中的下一个元素。

    void remove():删除集合集合中上一次next方法返回的元素。

    void forEachRemning(Consumer action):使用Lambda表达式遍历集合。

    当使用Iterator迭代访问Collection集合元素时,Collection集合里的元素不能被改变,只有通过Iterator的remove方法删除上一次next()方法返回的集合元素才可以,否则会引发异常。

    public class IteratorTest2 {
        public static void main(String[] args){
            Collection books = new HashSet();
            books.add("轻量级java企业应用开发");
            books.add("疯狂java讲义");
            books.add("疯狂android");
            Iterator it = books.iterator();
            while(it.hasNext()){
                String book = (String)it.next();
              //输出:疯狂java讲义
    // 轻量级java企业应用开发
    // 疯狂android

    System.out.println(book);
    if (book.equals("疯狂java讲义")) { it.remove(); } }        //输出:[轻量级java企业应用开发, 疯狂android]
         System.out.println(books); } }

    使用Lambda表达式遍历Iterator

    java8为Iterator提供了一个forEachRemning(Consumer action)方法,该方法所需的也是Consumer参数同样也是函数式接口。当程序调用Iterator的forEachRemning(Consumer action)遍历集合元素时,程序会依次将集合元素传给Consumer的accept(T t)方法(该接口中唯一的方法)。

    public class IteratorEach {
        public static void main(String[] args){
            Collection books = new HashSet();
            books.add("轻量级java企业应用开发");
            books.add("疯狂java讲义");
            books.add("疯狂android");
            Iterator it = books.iterator();
            /*迭代元素集合为:疯狂java讲义
                  迭代元素集合为:轻量级java企业应用开发
                  迭代元素集合为:疯狂android*/
            it.forEachRemaining(obj -> System.out.println("迭代元素集合为:" + obj));
        }
    }

    使用foreach循环遍历集合元素

    除了可以使用Iterator接口迭代访问Collection集合里的元素之外,使用java5提供的foreach循环迭代访问集合元素更加快捷。

    public class ForeachTest {
        public static void main(String[] args){
            Collection books = new HashSet();
            books.add("轻量级java企业应用开发");
            books.add("疯狂java讲义");
            books.add("疯狂android");
            for(Object obj : books){
                String book = (String)obj;
                /*疯狂java讲义
                轻量级java企业应用开发
                疯狂android*/
                System.out.println(book);
                if (book.equals("疯狂Andriod讲义")) {
                    //下面代码将要引发异常
                    books.remove(book);
                }
            }
            //[疯狂java讲义, 轻量级java企业应用开发, 疯狂android]
            System.out.println(books);
        }

     使用java8新增的Prdicate操作集合:

    java8为Collectio集合新增一个removeIf(Predicate filter)方法,该方法将会批量删除符合filter条件的所有元素。

    public class PredicateTest {
        public static void main(String[] args){
            Collection books = new HashSet();
            books.add(new String("轻量级java应用开发"));
            books.add(new String("疯狂java讲义"));
            books.add(new String("疯狂IOS讲义"));
            books.add(new String("疯狂Ajax讲义"));
            books.add(new String("疯狂android讲义"));
            //统计书名包括“疯狂”子串的图书数量.输出:4
            System.out.println(calAll(books,ele -> ((String)ele).contains("疯狂")));
            //统计书名字符串长度大于10的图书数量.输出:2
            System.out.println(calAll(books,ele -> ((String)ele).length()>10));
        }
        public static int calAll(Collection books , Predicate p ){
            int total = 0;
            for(Object obj : books){
                if (p.test(obj)) {
                    total++;
                }
            }
            return total;
        }
    }

     使用java8新增的Stream操作集合:

    java8新增了Stream,IntStream,LongStream,DoubleStream等流式API,这些api代表多个支持串行和并行聚集操作的元素。上面四个接口中,Stream代表一个通用的流接口,其他则分别代表元素类型为int,long,double的流。

    独立使用流的方法:

    1.使用Stream或Xxxstream的builder()类方法创建该Stream对应的Builder。

    2.重复调用Budiler的add()方法,向该流中添加多个元素。

    3.调用Builder的build()方法获取相应的Stream。

    4.调用Stream的聚集方法。

    对于大部分的聚集方法而言,每个Stream只能执行一次。

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

    〉中间方法:中间操作允许流保持打开操作,并且可以直接调用后续的方法。中间方法的返回值是另一个流。

    〉末端方法:末端方法是对流的最终操作。当对某个Stream对象执行末端方法后,该流将会被”消耗“,且不可再用。

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

    1.有状态的方法:这个方法会为流增加一些新的特征,比如元素的唯一性,元素的最大数量,保证元素以排序的方式被处理。有状态的方法往往需要更大的开销。

    2.短路方法:短路方法可以尽早结束对流的操作,不必检查每个元素。

    Stream常用的中间方法

    filter(Predicate predicate):过滤所有不符合predicate的元素。

    map ToXxx(ToXxxFunction mapper):使用ToXxxFunction对流中的元素进行一对一的转换,返回一个新流包含转换后生成的所用元素。

    peek(Consumer action):依次对每个元素执行一些操作,该方法返回的流与原有流包含相同的元素。该方法主要用于调试。

    distinct():该方法用于排序流中所用重复的元素(判断元素重复的标准是使用equals()方法比较返回true)。这是一个有状态的方法。

    sorted():该方法保证流中的元素在后续的操作中处于有序状态。这是一个有状态的方法。

    limit(long maxSize):该方法用于保证对流的后续访问中最大允许的元素个数。这是一个有状态,短路方法。

    常用的末端方法

    forEach(Consumer action):遍历流中的元素,对每个元素执行action。

    toArray():将流中所有的元素转换为数组形式。

    reduce():该方法有三个重载的版本,都用于通过某种操作来合并流中的元素。

    min():返回流中元素的最小值。

    max():返回流中元素的最大值。

    count():返回流中所用元素的数值。

    anyMatch(Predicate predicate):判断流中是否至少包含一个符合Predicate条件。

    allMatch(Predicate predicate):判断流中是否每个元素都符合Predicate条件。

    noneMatch(Predicate predicate):判断流中是否所有元素都不包括符和Predicate条件。

    findFirst():返回流中第一个元素。

    findAny():返回流中任意一个元素。

    public class CollectionStream {
        public static void main(String[] args){
            Collection books = new HashSet();
            books.add(new String("轻量级java应用开发"));
            books.add(new String("疯狂java讲义"));
            books.add(new String("疯狂IOS讲义"));
            books.add(new String("疯狂Ajax讲义"));
            books.add(new String("疯狂android讲义"));
            //统计书中包含“疯狂”子串的图书数量
            //输出:4
            System.out.println(books.stream()
                    .filter(ele -> ((String)ele).contains("疯狂"))
                    .count());
            //统计书名中包含“java”子串的图书数量
            //输出:2
            System.out.println(books.stream()
                    .filter(ele -> ((String)ele).contains("java"))
                    .count());
            //统计图书中字符串长度大于10的图书数量
            //输出:2
            System.out.println(books.stream()
                    .filter(ele -> ((String)ele).length() > 10)
                    .count());
            /*先调用Collection对象的stream方法将集合转换为Stream
             * 再调用Stream中的mapToXxx()方法,进行转换
             */
            books.stream().mapToInt(ele -> ((String)ele).length())
                    //用forEach方法遍历IntStream中每个元素
                    //输出:8 8 7 11 11
                    .forEach(System.out::println);
        }
    }

                                                                                                                                                  ---------《疯狂java讲义》8.2

  • 相关阅读:
    第六章脑图
    20192419实验四 《Python程序设计》实验报告
    20192419 实验三《Python程序设计》实验报告
    20192419 实验二《Python程序设计》实验报告
    20192419 实验一《Python程序设计》实验报告
    小组讨论-第十章 密码学及应用
    2019-2020-1学期 20192419 《网络空间安全专业导论》第十二周学习总结 (读书笔记)
    2019-2020-1学期 20192419 《网络空间安全专业导论》第十二周学习总结 (读书心得)
    2019-2020-1学期 20192419 《网络空间安全专业导论》第十一周学习总结 (读书心得)
    2019-2020-1学期 20192419 《网络空间安全专业导论》第十一周学习总结 (读书笔记)
  • 原文地址:https://www.cnblogs.com/mercuryli/p/4615230.html
Copyright © 2011-2022 走看看