zoukankan      html  css  js  c++  java
  • Java集合

    1.Java集合的概述:

        为了保存数量不确定的数据,以及保存具有映射关系的数据(也成关联数组),Java提供了集合类,集合类主要负责保存,盛装其他数据,因此集合类也被称为容器类。

    Java集合主要由Collection和Map两个接口派生而出,时Java集合框架的根接口,这两个接口又包含了一些子接口或实现类:

      在图8.1中Set和List是collection接口派生的两个子接口,分别代表无序集合和有序集合,Queue是Java提供的队列的实现

      图8.2 是map体系的继承树,所有map实现类用于保存具有映射关系的数据,Map保存的每项数据都是key-value对,且key是不可以重复的,key用于表示集合里每项数据

      根据以上两个图,可以把Java所有几何分成三大类:Set ,List, Map.

    2.Collection和Iterator接口

      Collection是LIst,Set,Queue接口的父接口,里面定义了如下操作集合元素的方法:

     

     2.1使用Lambda表达式遍历集合:

      

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

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

     1 package mcy;
     2 
     3 import java.util.Collection;
     4 import java.util.HashSet;
     5 
     6 public class CollectionEach {
     7     public static void main(String []args){
     8         Collection<String> books = new HashSet<String>();
     9         
    10         books.add("hello world");
    11         books.add("hello world1");
    12         books.add("hello world2");
    13         books.add("hello world3");
    14         
    15         books.forEach(obj -> System.out.println("迭代集合元素 "+obj));
    16     }
    17 }
    18 //输出为:
    19 迭代集合元素 hello worlda
    20 迭代集合元素 hello worldb
    21 迭代集合元素 hello worldc
    22 迭代集合元素 hello worldd

    2.2使用Java 8增强的Iterator遍历集合元素

    java 8 为Iterator新增了一个forEachRemaining(Consumer action)方法,该方法所需的Consumer参数同样也是函数式接口。当程序调用Iterator的forEachRemaining(Consumer action)遍历集合元素时,程序会一次将集合元素传递给Consumer的accept(T t)方法(该接口中唯一的抽象方法)。Iterator主要用于遍历,也称迭代器.

    Iterator接口里定义了如下四个方法:

    1.boolean hasNext(): 如果被迭代的集合元素还没有遍历完,返回true

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

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

    4.void forEachRemaining(Consumer action)

    package mcy;
    
    import java.util.Collection;
    import java.util.HashSet;
    import java.util.Iterator;
    
    public class IteratorTest {
        public static void main(String []args){
            Collection<String> books = new HashSet<String>();
            books.add("hello worlda");
            books.add("hello worldb");
            books.add("hello worldc");
            books.add("hello worldd");
            
            Iterator<String> it = books.iterator();
            while(it.hasNext()){
                String book = it.next();
                System.out.println(book);
                if(book.equals("hello worlda")){
                    it.remove();
                }
            }
            System.out.println(books);
        }
    }
    //输出:
    hello worlda
    hello worldb
    hello worldc
    hello worldd
    [hello worldb, hello worldc, hello worldd]  //hello worlda被删除了

    注意:Iterator仅用于遍历集合,Iterator本身并不提供盛装对象的能力,如果需要创建Iterator对象,则必须有一个被迭代的集合,没有集合的Iterator无存在的价值

    Iterator必须依赖于Collection对象,若有一个Iterator对象则必然有一个与之关联的Collection对象

    2.3 使用Lambda表达式遍历Iterator

    java 8 为Iterator新增了一个forEachRemaining(Consumer action)方法,该方法所需的Consumer参数同样也是函数式接口。当程序调用Iterator的forEachRemaining(Consumer action)遍历集合元素时,程序会一次将集合元素传递给Consumer的accept(T t)方法(该接口中唯一的抽象方法)

    package mcy;
    
    import java.util.Collection;
    import java.util.HashSet;
    import java.util.Iterator;
    
    public class IteratorTest {
        public static void main(String []args){
            Collection<String> books = new HashSet<String>();
            books.add("hello worlda");
            books.add("hello worldb");
            books.add("hello worldc");
            books.add("hello worldd");
            
            Iterator<String> it = books.iterator();
            
            it.forEachRemaining(obj -> System.out.println("迭代元素: " +obj));
        }
    }
    //输出:
    迭代元素: hello worlda
    迭代元素: hello worldb
    迭代元素: hello worldc
    迭代元素: hello worldd

    2.4使用foreach循环遍历集合元素

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

    package mcy;
    
    import java.util.Collection;
    import java.util.HashSet;
    import java.util.Iterator;
    
    public class IteratorTest {
        public static void main(String []args){
            Collection<String> books = new HashSet<String>();
            books.add("hello worlda");
            books.add("hello worldb");
            books.add("hello worldc");
            books.add("hello worldd");
            
            for(Object obj : books){
                System.out.println(obj);
            }
        }
    }
    //输出:
    hello worlda
    hello worldb
    hello worldc
    hello worldd

    2.5使用Java 8新增的Predicate操作集合

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

    package mcy;
    import java.util.Collection;
    import java.util.HashSet;
    public class IteratorTest {
        public static void main(String []args){
            Collection<String> books = new HashSet<String>();
            books.add("hello");
            books.add("hello a");
            books.add("hello aaaaaaa");
            books.add("hello bbbbbbbbbbb");
            
            books.removeIf(ele -> ((String)ele).length()<10);
            System.out.println(books);    
        }
    }
    输出:
    [hello bbbbbbbbbbb, hello aaaaaaa]  //长度小于10的被过滤掉了

    Predicate可以简化集合的运算:

    package mcy;
    import java.util.Collection;
    import java.util.HashSet;
    import java.util.function.Predicate;
    public class IteratorTest {
        public static void main(String []args){
            Collection<String> books = new HashSet<String>();
            books.add("hello a");
            books.add("hello b");
            books.add("hello ccccc");
            books.add("hello bbb");
            
            System.out.println(calAll(books,ele -> ((String)ele).contains("hello a")));
            System.out.println(calAll(books,ele -> ((String)ele).contains("hello bbb")));
            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)){//Predicate的test()方法判断该对象是否满足Predicate指定的条件
                    total++;
                }
            }
            return total;
        }
    }
    //输出:
    1
    1
    1
  • 相关阅读:
    Mysql定时器定时删除表数据
    Mysql中文排序规则
    Swoole学习-Swoole入门指南
    Cygwin安装swoole及错误解决
    php://input ,$_POST, $_GET和$HTTP_RAW_POST_DATA
    tp5-微信消息接收和处理
    [软件工程] 千帆竞发图的制作
    [构建之法论坛] 助教之路
    VS社区版 使用 OpenCover 获取测试代码覆盖率
    支持多编程语言的自动测试系统
  • 原文地址:https://www.cnblogs.com/black-mcy/p/9954028.html
Copyright © 2011-2022 走看看