《Effective Java 第三版》——第七章 Lambda 和 Stream

《Effective Java 第三版》——第二章 创建和销毁对象

《Effective Java 第三版》——第三章 所有对象都通用的方法

《Effective Java 第三版》——第四章 类和接口 

《Effective Java 第三版》——第五章 泛型

 《Effective Java 第三版》——第六章 枚举和注解

 《Effective Java 第三版》——第七章 Lambda 和 Stream 

 

 

 

 

 

package effectivejava.chapter7.item45.anagrams;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Stream;

import static java.util.stream.Collectors.groupingBy;

// Tasteful use of streams enhances clarity and conciseness (Page 205)
public class HybridAnagrams {
    public static void main(String[] args) throws IOException {
        Path dictionary = Paths.get(args[0]);
        int minGroupSize = Integer.parseInt(args[1]);

        System.out.println("Working Directory =" +
                System.getProperty("user.dir"));

        try (Stream<String> words = Files.lines(dictionary)) {
            System.out.println();
            Collection<List<String>> collectionValues =  words.collect(groupingBy(word -> alphabetize(word))).values();
            System.out.println(collectionValues);
            System.out.println();
        }

        try (Stream<String> words = Files.lines(dictionary)) {
            words.collect(groupingBy(word -> alphabetize(word)))
                    .values().stream()
                    .filter(group -> group.size() >= minGroupSize)
                    .forEach(g -> System.out.println(g.size() + ": " + g));
        }
    }

    private static String alphabetize(String s) {
        char[] a = s.toCharArray();
        Arrays.sort(a);
        return new String(a);
    }
}
/Library/Java/JavaVirtualMachines/jdk-13.0.2.jdk/Contents/Home/bin/java -Dfile.encoding=UTF-8 -classpath /Users/didi/git/effective-java-3e-source-code/bin effectivejava.chapter7.item45.anagrams.HybridAnagrams ./src/effectivejava/chapter7/item45/anagrams/dict.txt 2
Working Directory =/Users/didi/git/effective-java-3e-source-code

[[, , ], [Family], [Education], [    General sources], [    Museums,     Museums], [    Citations], [    Notes], [References], [Life, Life, Life, Life, Life], [Published author], [See also, See also, See also]]

3: [, , ]
2: [    Museums,     Museums]
5: [Life, Life, Life, Life, Life]
3: [See also, See also, See also]

Process finished with exit code 0
Life
Family
Education
Published author
References
    Notes
    Citations
    General sources
See also
See also
See also
Life
Life
Life
Life
    Museums
    Museums
dict.txt

 

 说白了就是得把中间结果通过某种形式存下来

。。。效率会降低。。。

package effectivejava.chapter7.item45;

import java.math.BigInteger;
import java.util.stream.Stream;

import static java.math.BigInteger.*;

// Generating the first twent Mersenne primes using streams (Page 208)
public class MersennePrimes {
    static Stream<BigInteger> primes() {
        return Stream.iterate(TWO, BigInteger::nextProbablePrime);
    }

//    public static void main(String[] args) {
//        primes().map(p -> TWO.pow(p.intValueExact()).subtract(ONE))
//                .filter(mersenne -> mersenne.isProbablePrime(50))
//                .limit(20)
//                .forEach(mp -> System.out.println(mp.bitLength() + ": " + mp));
//    }

    public static void main(String[] args) {
        //primes().forEach(System.out::println);
        primes().map(p ->
                TWO.pow(p.intValueExact()).subtract(ONE))
                .filter(mersenne ->
                        mersenne.isProbablePrime(50))
                .limit(10)
                .forEach(mp ->
                        System.out.println(mp.bitLength() + ": " + mp));
    }
}
package effectivejava.chapter7.item45;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
import static java.util.stream.Collectors.*;

// Generating the Cartesian product of two lists using iteration and streams (Page 209)
public class Card {
    public enum Suit { SPADE, HEART, DIAMOND, CLUB }
    public enum Rank { ACE, DEUCE, THREE, FOUR, FIVE, SIX, SEVEN,
                       EIGHT, NINE, TEN, JACK, QUEEN, KING }

    private final Suit suit;
    private final Rank rank;

    @Override public String toString() {
        return rank + " of " + suit + "S";
    }

    public Card(Suit suit, Rank rank) {
        this.suit = suit;
        this.rank = rank;

    }
    private static final List<Card> NEW_DECK = newDeck();

//    // Iterative Cartesian product computation
//    private static List<Card> newDeck() {
//        List<Card> result = new ArrayList<>();
//        for (Suit suit : Suit.values())
//            for (Rank rank : Rank.values())
//                result.add(new Card(suit, rank));
//        return result;
//    }

    // Stream-based Cartesian product computation
    private static List<Card> newDeck() {
        return Stream.of(Suit.values())
                .flatMap(suit ->
                        Stream.of(Rank.values())
                                .map(rank ->
                                        new Card(suit, rank)))
                .collect(toList());
    }

    public static void main(String[] args) {
        System.out.println(NEW_DECK);
    }
}

 

 深水区...


随笔分类 - Java8

java8学习之Stream源码分析
摘要:上一次已经将Collectors类中的各种系统收集器的源代码进行了完整的学习,而在之前咱们已经花了大量的篇幅对其Stream进行了详细的示例学习,如: 那接下来则通过源代码的角度来对Stream的运作原理进行深入的学习,比如:Stream里面提供了这么多方法都是如何实现的?串行流与并行流又是如何调用 阅读全文

posted @ 2018-02-02 15:43 cexo 阅读(357) 评论(0) 推荐(0) 编辑

java8学习之groupingByConcurrent与partioningBy源码分析
摘要:在上一次【http://www.cnblogs.com/webor2006/p/8387656.html】中对于Collectors.groupingBy()方法进行了完整的分析之后,接着继续来分析一下Collectors其它跟它类似的方法:groupingByConcurrent()、partio 阅读全文

posted @ 2018-02-01 13:54 cexo 阅读(494) 评论(0) 推荐(0) 编辑

java8学习之groupingBy源码分析
摘要:继续接着上一次【http://www.cnblogs.com/webor2006/p/8366083.html】来分析Collectors中的各种收集器的实现, 对里它里面有个groupingby()方法,这个之前咱们也已经对它详细使用过,但是!!它的实现是比较复杂的,所以这次来仔细分析一下该方法的 阅读全文

posted @ 2018-01-30 22:27 cexo 阅读(445) 评论(1) 推荐(0) 编辑

java8学习之Collectors工厂类源码分析与实战
摘要:如上一节【http://www.cnblogs.com/webor2006/p/8360232.html】在结尾处谈到的,彻底理解了Collector收集器之后,有必要对其系统Collectors实现的各种非常常见的收集器进行仔细阅读,所以这也是接下来要去完成的,下面开始。 对于Collectors 阅读全文

posted @ 2018-01-27 14:57 cexo 阅读(221) 评论(0) 推荐(1) 编辑

java8学习之收集器枚举特性深度解析与并行流原理
摘要:首先先来找出上一次【http://www.cnblogs.com/webor2006/p/8353314.html】在最后举的那个并行流报错的问题,如下: 在来查找出上面异常的原因之前,当然得要一点点去排查,所以下面会做实验一步步来为找到这个问题而努力。 下面咱们将循环次数只为1次,先来观察日志输出 阅读全文

posted @ 2018-01-26 16:32 cexo 阅读(177) 评论(0) 推荐(0) 编辑

java8学习之自定义收集器深度剖析与并行流陷阱
摘要:自定义收集器深度剖析: 在上次【http://www.cnblogs.com/webor2006/p/8342427.html】中咱们自定义了一个收集器,这对如何使用收集器Collector是极有帮助的,这次基于它再来进一步,争取彻底理解收集器的所有概念,这里再定义一个新的收集器,其实现如下需求: 阅读全文

posted @ 2018-01-25 21:31 cexo 阅读(192) 评论(0) 推荐(0) 编辑

java8学习之自定义收集器实现
摘要:在上次花了几个篇幅对Collector收集器的javadoc进行了详细的解读,其涉及到的文章有: http://www.cnblogs.com/webor2006/p/8311074.html http://www.cnblogs.com/webor2006/p/8318066.html http: 阅读全文

posted @ 2018-01-24 16:46 cexo 阅读(276) 评论(0) 推荐(0) 编辑

java8学习之比较器深入
摘要:继续接着上次【http://www.cnblogs.com/webor2006/p/8331498.html】的比较器进行探究,上次排序采用是的利用Collections.sort()进行的,下面采用List集合本身的sort()方法【Java8才加入的】,其使用基本上类似: 接下来同样改用Lamb 阅读全文

posted @ 2018-01-24 15:31 cexo 阅读(138) 评论(0) 推荐(0) 编辑

java8学习之比较器详解与类型推断特例
摘要:比较器详解: 这次来对比较器进行一个学习,比较器(Comparator)这个是在JDK1.2就提出的概念,只是说JAVA8针对它进行了一定的扩充,更加方便咱们使用,其中唯一的抽象方法如下: 而JAVA8中对这个接口进行扩展的当然就是一些默认或静态方法啦,如: 下面来粗略的来了解一下这新增的具体实现的 阅读全文

posted @ 2018-01-22 22:34 cexo 阅读(172) 评论(0) 推荐(0) 编辑

java8学习之收集器用法详解与多级分组和分区
摘要:收集器用法详解: 在上次已经系统的阅读了Collector收集器的Javadoc对它已经有一个比较详细的认知了,但是!!!它毕境是只是一个接口,要使用的话还得用它的实现类,所以在Java8中有它进行了实现,而且也只有唯一的一个实现,其实现类名叫:CollectorImpl,它在咱们已经使用过N次的C 阅读全文

posted @ 2018-01-21 21:57 cexo 阅读(185) 评论(0) 推荐(0) 编辑

java8学习之Collector复合与注意事项
摘要:接着上一次【http://www.cnblogs.com/webor2006/p/8318066.html】继续对Collector进行javadoc详读,上一次读到了这: 接下来一条条来过目一下: 要理解这段说明,则首先先要了解Collector接口的三个泛型,如下: 比如说: 其实也就是累积生成 阅读全文

posted @ 2018-01-21 15:29 cexo 阅读(157) 评论(0) 推荐(0) 编辑

java8学习之Collector同一性与结合性分析
摘要:继续沿着上一次【http://www.cnblogs.com/webor2006/p/8311074.html】Collector接口的javadoc进行阅读,在继续阅读之前,其中有个比较难理解的地方需要再解释一下,如下: 上面的javadoc描述的到底是怎么一回事呢?下面来好好理解下: 对于com 阅读全文

posted @ 2018-01-19 17:25 cexo 阅读(148) 评论(0) 推荐(0) 编辑

java8学习之Collector源码分析与收集器核心
摘要:之前已经对流在使用上已经进行了大量应用了,也就是说对于它的应用是比较熟悉了,但是比较欠缺的是对于它底层的实现还不太了解,所以接下来准备大量通过阅读官方的javadoc反过来加深对咱们已经掌握这些知识更加深层次的理解,这个阅读会是一个比较枯燥的,但是它的价值是非常非常大的,也就是要达到知其然知其所以然 阅读全文

posted @ 2018-01-18 16:54 cexo 阅读(249) 评论(0) 推荐(0) 编辑

java8学习之Stream分组与分区详解
摘要:Stream应用: 继续举例来操练Stream,对于下面这两个集合: 需求是:将这两个集合组合起来,形成对各自人员打招呼的结果,输出的结果如: "Hi zhangsan"、"Hi lisi"、"Hi wangwu"、"Hi zhangliu"; "Hello zhangsan"、"Hello lis 阅读全文

posted @ 2018-01-18 15:10 cexo 阅读(508) 评论(0) 推荐(0) 编辑

java8学习之流的短路与并发流
摘要:并发流: 从api的角度来看,其实跟咱们之前一直在用的stream()方式差不多,但是底层是有明显的不同,所以这里初步先对并发流有一个基本的认识, 说到串行与并行,最直观的感受就是效率的不同,所以下面以一个相同条件下用串行流与并行流实现看具体耗时为例,来直观的感受一下它们两者在时间效率上的不同,如下 阅读全文

posted @ 2018-01-17 16:18 cexo 阅读(222) 评论(0) 推荐(0) 编辑

java8学习之内部迭代与外部迭代本质剖析及流本源分析
摘要:关于Stream在Java8中是占非常主要的地位的,所以这次对它进行进一步探讨【这次基本上都是偏理论的东东,但是理解它很重要~】,其实流跟咱们数据库学习当中的sql语句的特点是非常非常之像的,为什么这么说,下面以这个sql语句举例说明: “select name from student where 阅读全文

posted @ 2018-01-17 13:41 cexo 阅读(314) 评论(0) 推荐(0) 编辑

java8学习之Stream陷阱剖析
摘要:上一次【http://www.cnblogs.com/webor2006/p/8297603.html】在最后用stream.iterate()生成了6个奇数,接着基于它来实现如下需求:找出该流中大于2的元素,然后再将每个元素乘以2,然后忽略掉流中的前两个元素,然后再取流中的前两个元素,最后求出流中 阅读全文

posted @ 2018-01-16 22:24 cexo 阅读(183) 评论(0) 推荐(0) 编辑

java8学习之Stream实例剖析
摘要:继续操练Stream,直接上代码: 而咱们要返回ArrayList,显示可以用构造引用来传递到里面,因为它刚好符合Supplier函数式接口的特性:不接收参数返回一个值,所以: 接下来试着将Stream转换成其它集合类型,比如:Set,如下: 接下来将集合中的字符串元素拼成一起然后再输出出来,继续可 阅读全文

posted @ 2018-01-16 17:07 cexo 阅读(151) 评论(0) 推荐(0) 编辑

java8学习之Stream深度解析与源码实践
摘要:继续对流进行学习,首先先说明一下流的特点: 1、Collection提供了新的stream()方法。 2、流不存储,通过管道的方式获取值。 3、本质是函数式的,对流的操作会生成一个结果,不过并不会修改底层的数据源,集合可以作为流的底层数据源。其中需要注意标红的说明,也就是说对于流操作它的源数据是不会 阅读全文

posted @ 2018-01-15 22:11 cexo 阅读(240) 评论(0) 推荐(0) 编辑

java8学习之Stream介绍与操作方式详解
摘要:关于默认方法【default method】的思考: 在上一次【http://www.cnblogs.com/webor2006/p/8259057.html】中对接口的默认方法进行了学习,那在Java8中在接口中接出默认方法是为了解决什么问题或者说规避什么问题呢?凡是在JDK引入一个新的概念肯定是 阅读全文

posted @ 2018-01-13 22:30 cexo 阅读(309) 评论(0) 推荐(0) 编辑

java8学习之方法引用详解及默认方法分析
摘要:方法引用: 之前花了很多时间对Lambda表达式进行了深入的学习,接下来开启新的主题 方法引用(Method References),其实在之前的学习中已经使用过了,如: 那方法引用跟Lambda表达式是一种什么关系呢?其实可以理解为它是Lambda表达式的一个语法糖(Syntactic sugar 阅读全文

posted @ 2018-01-10 15:53 cexo 阅读(212) 评论(0) 推荐(0) 编辑

java8学习之Optional深入详解
摘要:自上次【http://www.cnblogs.com/webor2006/p/8243874.html】函数式接口的学习告一段落之后,这次来学习一下Optional,它并非是函数式接口的概念,点击查看源码便知: 那它是用来干嘛的呢?其实用它是用来避勉非常常见的NPE(NullPointerExcep 阅读全文

posted @ 2018-01-09 15:11 cexo 阅读(306) 评论(0) 推荐(0) 编辑

java8学习之Supplier与函数式接口总结
摘要:Supplier接口: 继续学习一个新的函数式接口--Supplier,它的中文意思为供应商、提供者,下面看一下它的javadoc: 而具体的方法也是相当的简单,就是不接受任何参数,返回一个结果: 对它有了大概的了解之后,下面用代码来使用一下它: 貌似这函数的使用相当简单呀,但是简单并非是它的用处少 阅读全文

posted @ 2018-01-08 17:42 cexo 阅读(7146) 评论(0) 推荐(0) 编辑

java8学习之Predicate深入剖析与函数式编程本质
摘要:上次【http://www.cnblogs.com/webor2006/p/8214596.html】对Predicate函数接口进行了初步的学习,其中提到了在未来要学习的Stream中得到了大量的应用, 正因为很重要,所以这次再详细的对它进行学习,其中还包含它里面定义的一些默认的方法,为之后的学习 阅读全文

posted @ 2018-01-06 22:58 cexo 阅读(354) 评论(0) 推荐(0) 编辑

java8学习之BiFunction函数式接口实例演示&Predicate函数式接口详解
摘要:BiFunction函数式接口: 在上次中已经对BiFunction接口进行了初步的认识,这里对它进一步学习,这里打算新建一个Person实体,然后新建若干个Person的实例存放在集合中,最后再根据若干条件来从集合中挑选满足指定条件的元素,下面开始: 然后新建几个Person对象存放在集合元素中: 阅读全文

posted @ 2018-01-06 16:32 cexo 阅读(506) 评论(0) 推荐(0) 编辑

java8学习之Function与BiFunction函数式接口详解
摘要:Function接口: 上次中已经使用了Function的apply()方法,但是在这个接口中还存在三个具体实现的方法,如下: 下面来仔细的将剩下的方法学习一下: compose(): 首先来读一下该方法的javadoc的描述: 一路读下来貌似还是有点懵,感觉好绕,下面再来看一下它的具体实现,这样可 阅读全文

posted @ 2018-01-05 14:59 cexo 阅读(4339) 评论(0) 推荐(0) 编辑

java8学习之Lambda表达式继续探讨&Function接口详解
摘要:对于上次【http://www.cnblogs.com/webor2006/p/8186039.html】已经初步引入的Java8中Stream流的概念,其中使用了map的操作,它需要接受一个Function这样的函数式接口,回顾一下: 而这次专门对Function这个函数式接口进行进一步学习,因为 阅读全文

posted @ 2018-01-04 16:03 cexo 阅读(542) 评论(0) 推荐(1) 编辑

java8学习之Lambda表达式深入与流初步
摘要:Lambda表达式深入: 在上一次【http://www.cnblogs.com/webor2006/p/8135873.html】中介绍Lambda表达式的作用时,其中说到这点: 如标红处所说,既然Lambda表达式是一个对象,而且必须依附于一类特别的对象类型叫函数式接口,那么如果咱们给出了一个L 阅读全文

posted @ 2018-01-03 22:20 cexo 阅读(363) 评论(0) 推荐(2) 编辑

java8学习之深入函数式接口与方法引用
摘要:函数式接口: 函数式接口【FunctionalInterface】是整个Lambda表达式的一个根源,换句话来说java8中的Lambda表达式要想彻底掌握,前提是要彻底理解好函数式接口,所以这次继续对函数式接口进行巩固。 先回顾一下上一次通过读FunctionalInterface这个注解的jav 阅读全文

posted @ 2017-12-28 15:18 cexo 阅读(2319) 评论(0) 推荐(1) 编辑

java8学习之Lambda表达式初步与函数式接口
摘要:对于Java8其实相比之前的的版本增加的内容是相当多的,其中有相当一大块的内容是关于Lambda表达式与Stream API,而这两部分是紧密结合而不能将其拆开来对待的,但是是可以单独使用的,所以从学习的顺序来说首先得要学好Lambda表达式,然后再学习Stream API,最后再把这两者有机的结合 阅读全文

posted @ 2017-12-25 22:39 cexo 阅读(424) 评论(0) 推荐(0) 编辑

Stream知识点总结及源码阅读
摘要:上次【http://www.cnblogs.com/webor2006/p/7795596.html】对Stream进行了简单的学习,这次继续学习Stream,还是结合java8 in action这本书来进行学习。 在书中作者用一个简短的一句话来概括什么是Stream,如下: 而这句话中描述了三个 阅读全文

posted @ 2017-11-23 22:11 cexo 阅读(214) 评论(0) 推荐(0) 编辑

Stream入门及Stream在JVM中的线程表现
摘要:继上次学习过Java8中的非常重要的Lambda表达式之后,接下来就要学习另一个也比较重要的知识啦,也就如标题所示:Stream,而它的学习是完全依赖于之前学习的Lambda表达式。 小实验引入: 这里继续参照java8 in action,关于Stream也是有专门章节去介绍的: 下面就正式开启S 阅读全文

posted @ 2017-11-06 22:31 cexo 阅读(189) 评论(0) 推荐(0) 编辑

Lambda方法推导(method references)
摘要:在上一篇【http://www.cnblogs.com/webor2006/p/7707281.html】中提到了方法推导的东东: 这里说细的学习一下它,下面走起! Method references【方法推导】: Method references【方法推导】: Method references 阅读全文

posted @ 2017-10-30 22:35 cexo 阅读(408) 评论(0) 推荐(0) 编辑

Lambda使用深入解析
摘要:这一次继续对Lambda表达式进行深入,因为它实在太重要了,这次会涉及到java.util.function中的一些新的FunctionalInterface的使用,用它来进一步巩固对Lambda表达式的理解。 进一步理解FunctionalInterface: 在java8开篇中就已经对什么是fu 阅读全文

posted @ 2017-10-21 22:51 cexo 阅读(278) 评论(0) 推荐(0) 编辑

Lambda表达式语法进一步巩固
摘要:上一次已经初步使用到了Lambda表达式了,这次再次对它的语法进行一下巩固,因为它实在是太重要的,所以多花时间彻底理解它是非常有必要的。 在"Java8 in Action"一书中对Lambda表达式有如下描述,做个了解: 下面则用代码去使用Lambda表达式来加深对它的印象,会有各种不同的形式,其 阅读全文

posted @ 2017-10-21 16:33 cexo 阅读(209) 评论(0) 推荐(0) 编辑

JAVA8初探-让方法参数具备行为能力并引入Lambda表达式
摘要:关于JAVA8学习的意义先来贴一下某网站上的对它的简单介绍:“Java 8可谓Java语言历史上变化最大的一个版本,其承诺要调整Java编程向着函数式风格迈进,这有助于编写出更为简洁、表达力更强,并且在很多情况下能够利用并行硬件的代码。Java 8所带来的函数式编程特性使得Java从此屹立于函数式编 阅读全文

posted @ 2017-10-15 16:47 cexo 阅读(313) 评论(0) 推荐(0) 编辑

 
   

 

package effectivejava.chapter7.item47;

import java.util.stream.Stream;
import java.util.stream.StreamSupport;

// Adapters from stream to iterable and vice-versa (Page 216)
public class Adapters {
    // Adapter from  Stream<E> to Iterable<E> (
    public static <E> Iterable<E> iterableOf(Stream<E> stream) {
        return stream::iterator;
    }

    // Adapter from Iterable<E> to Stream<E>
    public static <E> Stream<E> streamOf(Iterable<E> iterable) {
        return StreamSupport.stream(iterable.spliterator(), false);
    }
}
package effectivejava.chapter7.item47;

import java.util.*;

public class PowerSet {
    // Returns the power set of an input set as custom collection (Page 218)
    public static final <E> Collection<Set<E>> of(Set<E> s) {
        List<E> src = new ArrayList<>(s);
        if (src.size() > 30)
            throw new IllegalArgumentException("Set too big " + s);
        return new AbstractList<Set<E>>() {
            @Override public int size() {
                return 1 << src.size(); // 2 to the power srcSize
            }

            @Override public boolean contains(Object o) {
                return o instanceof Set && src.containsAll((Set)o);
            }

            @Override public Set<E> get(int index) {
                Set<E> result = new HashSet<>();
                for (int i = 0; index != 0; i++, index >>= 1)
                    if ((index & 1) == 1)
                        result.add(src.get(i));
                return result;
            }
        };
    }

    public static void main(String[] args) {
        Set s = new HashSet(Arrays.asList(args));
        System.out.println(PowerSet.of(s));
    }
}
package effectivejava.chapter7.item47;

import java.util.*;
import java.util.stream.IntStream;
import java.util.stream.Stream;

// Two ways to generate a stream of all the sublists of a list (Pages 219-20)
public class SubLists {
    // Returns a stream of all the sublists of its input list (Page 219)
    public static <E> Stream<List<E>> of(List<E> list) {
        return Stream.concat(Stream.of(Collections.emptyList()),
                prefixes(list).flatMap(SubLists::suffixes));
    }

    private static <E> Stream<List<E>> prefixes(List<E> list) {
        return IntStream.rangeClosed(1, list.size())
                .mapToObj(end -> list.subList(0, end));
    }

    private static <E> Stream<List<E>> suffixes(List<E> list) {
        return IntStream.range(0, list.size())
                .mapToObj(start -> list.subList(start, list.size()));
    }

//    // Returns a stream of all the sublists of its input list, excluding the empty list
//    // This version is derived from the obvious iterative code (Page 220)
//    public static <E> Stream<List<E>> of(List<E> list) {
//        return IntStream.range(0, list.size())
//                .mapToObj(start ->
//                        IntStream.rangeClosed(start + 1, list.size())
//                                .mapToObj(end -> list.subList(start, end)))
//                .flatMap(x -> x);
//    }

    public static void main(String[] args) {
        List<String> list = Arrays.asList(args);
        SubLists.of(list).forEach(System.out::println);
        System.out.println("---------");
        prefixes(list).forEach(System.out::println);
        System.out.println("---------");
        suffixes(list).forEach(System.out::println);
    }
}

 

 

package effectivejava.chapter7.item48;

import java.math.BigInteger;
import java.util.stream.LongStream;

public class ParallelPrimeCounting {
    // Prime-counting stream pipeline - parallel version (Page 225)
    static long pi(long n) {
        return LongStream.rangeClosed(2, n)
                .parallel()
                .mapToObj(BigInteger::valueOf)
                .filter(i -> i.isProbablePrime(50))
                .count();
    }

    public static void main(String[] args) {
        System.out.println(pi(10_000_000));
    }
}
package effectivejava.chapter7.item48;

import java.math.BigInteger;
import java.util.stream.Stream;

import static java.math.BigInteger.*;

// Parallel stream-based program to generate the first 20 Mersenne primes - HANGS!!! (Page 222)
public class ParallelMersennePrimes {
    public static void main(String[] args) {
        primes().map(p -> TWO.pow(p.intValueExact()).subtract(ONE))
                .parallel()
                .filter(mersenne -> mersenne.isProbablePrime(50))
                .limit(20)
                .forEach(System.out::println);
    }

    static Stream<BigInteger> primes() {
        return Stream.iterate(TWO, BigInteger::nextProbablePrime);
    }
}
原文地址:https://www.cnblogs.com/cx2016/p/13270366.html