• <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():返回流中的任意一个元素。

  • 相关阅读:
    C#yield return用法示例
    C#多线程示例
    AspNetCore.Authentication
    C#委托与事件
    按值和按引用传递参数
    基于iView的无限级菜单
    Sortable By Attribute
    未能加载文件或程序集“BLL”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集。
    有关导出Excel特殊字符的问题
    openFileDialog的使用
  • 原文地址:https://www.cnblogs.com/guguli/p/4396093.html
Copyright © 2020-2023  润新知