JAVA8 流 Stream 的使用

JAVA8流的使用

一、筛选和切片

  1. 用谓词筛选 ==filter(T -> T.getXX())==
  2. 判断相同 ==distinct()==
  3. 截断流 ==limit(n)==
  4. 跳过元素 ==skip(n)==
  5. 排序 ==sorted(Comparator.comparing(T::getXX))==
  6. 遍历 ==forEach(XXX)==

二、映射

  1. 对流中每一个元素应用函数 ==map()==
    ==> 一般用于提取流中的内容 map(T :: getXX)
  2. 流的扁平化 ==flatMap()==
    ==> 将一个流中每个值都转换成另外一个流,然后再将转换的所有的流链接成一个流

三、查找与匹配

  1. 查找至少一个匹配 ==anyMatch()==
  2. 查找是全匹配 ==allMatch()==
    对应的无匹配是 ==noneMatch()==
  3. 查找任意元素 ==findAny()==
  4. 查找第一个元素 ==findFirst()==
  5. 查找最小/最大的
    ==min(Comparator.comparing(T::getXX))==
    ==max(Comparator.comparing(T::getXX))==

四、归约

  1. 求和 ==reduce(初始值,Integer :: sum)==
ins2.stream().reduce(0,Integer::sum)

不加初始值 返回Optional类型
  1. 求最大最小 ==reduce(初始值,Integer :: sum)==
ins.stream().reduce(0,Integer::max)
ins.stream().reduce(0,Integer::min)

不加初始值 返回Optional类型

五、数值流

五A、原始类型流特化
  1. 映射到数值流
    ==mapToInt(XX :: getX)==
    ==mapToDouble(XX :: getX)==
    ==mapToLong(XX :: getX)==

映射成功后 可以使用sum(),max(),min(),avg() 等方法

  1. 转换为对象流 (类似装箱)
    ==boxed()==

  2. 默认值
    ==OptionalInt==
    ==OptionalDouble==
    ==OptionalLong==

OptionalInt XX =trans.parallelStream().mapToInt(Transaction::getValue).max()
int max = XX.orElse(N)   拖过没有最大值,则为默认的N
五B、数值范围

IntStream和LongStream 有 方法

==range(m,n)==
==rangeClosed(m,n)==
对比是 后者包含n,前者不包含n

生成勾股数
Stream<double[]> sqrt = IntStream.rangeClosed(1, 100).boxed()
    .flatMap(a -> IntStream.rangeClosed(a, 100)
            .mapToObj(b -> new double[]{a,b,Math.sqrt(a*a + b*b)})
            .filter(t -> t[2] % 1 == 0));
sqrt.limit(10).forEach(t -> System.out.println((int)t[0] + "," + (int)t[1] + "," + (int)t[2]));

六、构建流

//1.由值创建流
Stream<String> s = Stream.of("1","2","3","6");
Stream<String> s2 = Stream.empty(); //创建空流
s.forEach(System.out::println);

//2.由数组创建流
int[] nums = { 11,60,61,12,16,20 };
int sum = Arrays.stream(nums).sum();

//3.由文件生成流
long lines = 0;
try (Stream<String> s3 = Files.lines(Paths.get("data.txt"),
        Charset.defaultCharset())) {
    lines = s3.flatMap(line -> Arrays.stream(line.split(""))).distinct().count();
} catch (Exception e) {
}
System.out.println(sum + "::" + lines);

//4.函数生成流
//4.1 迭代 iterate(n,lambda) 方法接受初始值,并将lambda作用于每个值
Stream.iterate(0, a -> a+2).limit(10).forEach(System.out::println);
//4.1.1 测试 斐波那契数列
Stream.iterate(new int[]{0, 1}, t -> new int[]{t[1], t[0]+ t[1]})
        .limit(10).forEach(t -> System.out.print(t[0]+ " "));
Stream.iterate(new int[]{0, 1}, t -> new int[]{t[1], t[0]+ t[1]})
.limit(10).map(t -> t[0] + " ").forEach(System.out::print);

//4.2 生成 generate 接受一个 Supplier<T> 类型 Lambda值
IntStream.generate(new IntSupplier() {
    public int getAsInt(){
        return 2;
    }
});
IntStream.generate(() -> 2).limit(10).forEach(System.out::print);;
//4.2.2 测试 斐波那契数列
IntStream.generate(new IntSupplier(){           
    private int a = 0;private int b = 1;
    public int getAsInt() {
        int oldPrevious = a;
        int nextValue = a + b;
        a = b;
        b = nextValue;
        return oldPrevious;}
    }).limit(10).forEach(System.out::println);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • Java8 in action 没有共享的可变数据,将方法和函数即代码传递给其他方法的能力就是我们平常所说的函数式...
    铁牛很铁阅读 1,187评论 1 2
  • 第一章 为什么要关心Java 8 使用Stream库来选择最佳低级执行机制可以避免使用Synchronized(同...
    谢随安阅读 1,476评论 0 4
  • 概要 流让你从外部迭代转向内部迭代。这样,你就用不着写下面这样的代码来显式地管理数据集合的迭代(外部迭代)了: 现...
    浔它芉咟渡阅读 1,473评论 1 2
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,712评论 0 33
  • 提示内用的框比较傻比较愣
    bingling823阅读 193评论 0 1