zoukankan      html  css  js  c++  java
  • <JAVA8新增内容>关于集合的操作(Collection/Iterator/Stream)

    因为下文频繁使用lambda表达式,关于Java中的lambda表达式内容请见:

    http://www.cnblogs.com/guguli/p/4394676.html

    一.使用增强的Iterator遍历集合元素

      Iterator接口也是Java集合框架的成员,但它与Collection系列,Map系列的集合不一样:Collection系列集合,Map系列集合主要用于承装其他对象,而Iterator则主要用于遍历(即迭代访问)Collection集合中的元素,Iterator对象也被称为迭代器。

      Iterator接口隐藏了各种Collection实现类的底层细节,向应用程序提供了遍历Collection集合元素的统一编程接口,Iterator接口里面一般定义了下面4个方法。

    boolean hasNext():返回表示集合元素是否有没有被访问完的布尔值。

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

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

    void forEachRemaining(Consumer action):这是Java8为Iterator新增的默认方法,该方法可使用lambda表达式来遍历集合元素。

    public class IteratorTest{
        public static void main(String[] args){
            ....//c is a Collection<String>
            Iterator iter=c.iterator();
            while(iter.hasNext()){
                String s=(String)iter.next();
                System.out.println(s);
                if(s.equals("Content")){
                    iter.remove();
                }
                s="New Content";
            }
            System.out.println(s);
        }
    }


    ##Iterator仅用于遍历集合,Iterator本身并不提供承装对象的能力。

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

    ##Iterator迭代器采用的是快速失败(fail-fast)机制,一旦在迭代过程中检测到该集合已经被修改(通常是程序中的其他线程修改),程序立即抛出ConcurrentModificationException异常,而不是显示修改后的结果,这样可以避免共享资源而引发潜在的问题。

    二.使用Java8新增的Predicate操作集合

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

    ...
    Collection c=new HashSet();
    c.add(new String("Content 1"));
    c.add(new String("Content 2"));
    c.add(new String("Content 3"));
    /// lambda expression
    c.removeIf(s->((String)s).length()<10);
    System.out.println(c);

    使用Predicate可以充分简化集合的运算,使用lambda表达式使整个程序简介清晰。也可以使用callAll方法用一个Predicate类型的lambda表达式来进行全部筛选,类似于SQL语言中的select*。

    三.使用Java8新增的Stream操作集合

    Java8新增了Stream,IntStream,LongStream,DoubleStream等数据流处理的API,这些API代表多个支持串行和并行聚集操作的元素,上面4个接口中,Stream是一个通用的接口,而其他的**Stream接口则代表元素类型为Int/Double/Long的流。

    Java8为上面每个流接口提供了对应的Builder,例如Stream.Builder..开发者可以使用这些Builder来创建对应的流。步骤如下:

    ##使用Stream或者**Stream的builder()类方法创建该Stream对应的Builder。

    ##重复调用Builder的add()方法向该流中添加元素。

    ##调用Builder的build()方法获取对应的Stream

    ##调用Stream的聚集方法

    关于Stream的聚集操作,主要罗列解释如下(先解释两个概念##):

    ##intermediate(中间方法):中间操作允许流保持打开的状态,并允许直接调用后续方法

    ##terminal(末端方法):末端操作时对流的最终操作,当对某个Stream执行末端方法后,该流将无法继续使用

    /////// Intermediate

    (1)filter(Predicate p):返回全部使Predicate返回true的元素。

    (2)mapToXxx(ToXxxFunction mapper):对每一个流中的元素按复写ToXxxFunction的方法进行一对一的转换。

    (3)peek(Consumer c):类似于forEach操作。返回流于原有流包含相同的元素。该方法主要用于调试。

    (4)distinct():该方法用于排序流中所有重复的元素。

    (5)sorted():该方法用于保证流中的元素在后续的访问中处于有序的状态。

    (6)limit(long maxSize):该方法用于保证对流的后续元素访问中最大允许访问的元素个数。

    /////// Terminal

    (1)forEach(Consumer c):遍历元素对每一个元素执行c操作。

    (2)toArray():将流中的所有元素转换成为一个数组。

    (3)reduce():合并流中的元素。

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

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

    (6)count():返回流中的元素的数量。

    (7)anyMatch(Predicate p):判断流中是否至少包含一个元素符合p。

    (8)noneMatch(Predicate p):判断流中是否没有包含一个元素符合p。

    (9)allMatch(Predicate p):判断流中是否所有元素都符合p。

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

  • 相关阅读:
    欧拉回路 定理
    UESTC 1087 【二分查找】
    POJ 3159 【朴素的差分约束】
    ZOJ 1232 【灵活运用FLOYD】 【图DP】
    POJ 3013 【需要一点点思维...】【乘法分配率】
    POJ 2502 【思维是朴素的最短路 卡输入和建图】
    POJ 2240 【这题貌似可以直接FLOYD 屌丝用SPFA通过枚举找正权值环 顺便学了下map】
    POJ 1860【求解是否存在权值为正的环 屌丝做的第一道权值需要计算的题 想喊一声SPFA万岁】
    POJ 1797 【一种叫做最大生成树的很有趣的贪心】【也可以用dij的变形思想~】
    js 实现slider封装
  • 原文地址:https://www.cnblogs.com/guguli/p/4396093.html
Copyright © 2011-2022 走看看