写给大忙人的javaSE8-2019-01-17

2019-01-18  本文已影响0人  青山有扶苏
放下的,放不下的,最终都该属于自己的路,不必过分留恋与不舍
  1. 从外部迭代到内部迭代。
    通常在操作集合时,我们会使用到for循环(这里暂只说for这个操作集合的方法)。
    例如,我们要找出一个集合中,来自London的艺术家有几个。
    private static void withOut(List<ArtistEntity> artistArr) {
        int count =  0;
        for(ArtistEntity ae : artistArr) {
            if(ae.isFrom("London")) {
                count ++;
            }
        }
        System.out.println("来自伦敦的艺术家有" + count + "个");
    }

尽管这样做是可以达到目的的,但是每次迭代都需要写for (xxx xx:xxx) {}等这样的样板代码,java8以后,出现了一个新的方式,内部迭代。
首先内部迭代是将集合转换成一个 Stream,xxArray.stream(),这个方法返回的是一个Stream接口

private static void inside(List<ArtistEntity> artistArr) {
    long count = artistArr.stream().
        filter(artist -> artist.isFrom("London")).count();
    System.out.println("来自伦敦的艺术家有" + count + "个");
}

Stream是用函数式编程方式在集合类上进行复杂操作的工具。 上面这段例子,实际上可以分解成下面两个步骤。

2.惰性求值和及早求值。

artistArr.stream().filter(artist -> artist.isFrom("London"))

上述这段代码,实际上并未作出什么实际性的工作,filter只刻画出了一个Stream,但没有产生新的集合。像filter 这样只描述一个Stream,最终没有产生新集合的方法,称为惰性求值方法;而count这样最终会从 Steam产生值的方法叫做及早求值法。 下面做个小测试。

不产生新的集合,只产生一个Stream


artistArr.stream().filter(artist -> {
    System.out.println(artist.getName());
    return artist.isFrom("London");
});

运行这一段代码,是不会有任何输出的,因为filter只刻画出了一个Stream,但没有产生新的集合。

接下来,在调用一次count方法

//这段调用了count方法,终止了操作的流。因此就有值输出了,
artistArr.stream().filter(artist -> {
    System.out.println(artist.getName());
    return artist.isFrom("London");
}).count();

输出结果如下;

join
joyy
jone

小总结:

最后送给自己一句话

生命需要不断的努力,但是不要太急
上一篇下一篇

猜你喜欢

热点阅读