Stream

不是java io中的stream

对象创建

我们没有必要使用一个迭代来创建对象,直接使用流就可以

String[] strs = {"haha","hoho","lala"};
List<String> names = Arrays.asList(strs);
Stream<Person>stream = names.stream().map(Person::new);
List<Person> personList = stream.collect(Collectors.toList());

流使用起来代码更清晰

long count = personList.stream().filter(p->p.getName().length()>10).count();

流看上去有点像是集合,转换或者获取数据,不过有一定的差异性

  1. 流不会存储元素,,这些元素可能是 储存在底层的集合中,或者按需生成的
  2. 流的操作不会修改其数据源 比如filter会生成一个新的流
  3. 流的操作尽可能是惰性执行的

创建:可以使用Collection接口的stream方法

也可以使用静态方法Stream.of()

Stream<String>namesStream = Stream.of("haha","hoho","lala");

无限流

因为流的操作尽可能是惰性的,我们因此可以操作无限流

Stream <T> stream<T> generate(Supplier<T> s)

如果我们希望得到一个新的流,并且需要前n个元素,我们就可以使用 limit方法

namesStream.limit(2);

丢弃前几个元素

namesStream.skip(2)

流之间的连接

Stream.concat(stream1,stream2);

去重复

namesStream.distinct();

甚至还提供了排序接口

namesStream.sorted((s1,s2)->{return s1.length()-s2->length()});

甚至在使用的时候帮助自己调试

Stream.iterate(1.0,p->p*2).peek(e->System.out.println("Fetching"+e)).limit(20).toArray();

terminal 操作

max,min等等

Optional<T> max(Comparator<? super T>comparator)

返回的Optional有点类似于 C++ Boost中的optional,用于判断返回的结果是否有效

结果返回

stream.collect(Collectors.toList());
stream.collect(Collectors.toSet());
// 也有使用 toJoinning(", ")
//foreach
stream.forEach(System.out::println);
//如果需要转化字符串
stream.map(Object::toString);

收集到映射表中

//
Map<Integer,String> idToName = people.collect(
Collectors.toMap(Person::getId,Person::getName)
);
Map<Integer,Person> idToPerson = people.collect(
Collectors.toMap(Person::getId,Function.identity())
);

groupBy

//举一个java core中的例子
Map<String,List<Locale>>countryToLocales = locales.collect(
Collectors.groupingBy(Locale::getCountry));

下游收集器

Map<String,List<Locale>>countryToLocales = locales.collect(
Collectors.groupingBy(Locale::getCountry,toSet()));

Java 8 中有趣的操作 Stream的更多相关文章

  1. java 8中构建无限的stream

    目录 简介 基本使用 自定义类型 总结 java 8中构建无限的stream 简介 在java中,我们可以将特定的集合转换成为stream,那么在有些情况下,比如测试环境中,我们需要构造一定数量元素的 ...

  2. Java 8中用法优雅的Stream,性能也"优雅"吗?

    之前的文章中我们介绍了Java 8中Stream相关的API,我们提到Stream API可以极大提高Java程序员的生产力,让程序员写出高效率.干净.简洁的代码. 那么,Stream API的性能到 ...

  3. java集合框架之聚合操作stream

    参考http://how2j.cn/k/collection/collection-aggregate/702.html#nowhere 聚合操作 JDK8之后,引入了对集合的聚合操作,可以非常容易的 ...

  4. 在java程序中,对于数据的输入/输出操作以“流”(stream)方式进行

    在java程序中,对于数据的输入/输出操作以“流”(stream)方式进行

  5. 详解Java 8中Stream类型的“懒”加载

    在进入正题之前,我们需要先引入Java 8中Stream类型的两个很重要的操作: 中间和终结操作(Intermediate and Terminal Operation) Stream类型有两种类型的 ...

  6. Java中使用Jedis操作Redis(转载)

    整理 1.字符串 添加:set keyname value 查询:get keyname 拼接:append keyname value 删除:del keyname 添加多个: mset keyna ...

  7. 使用Java 8中的Stream

    Stream是Java 8 提供的高效操作集合类(Collection)数据的API. 1. 从Iterator到Stream 有一个字符串的list,要统计其中长度大于7的字符串的数量,用迭代来实现 ...

  8. Java 8中Stream API学习笔记

    1)函数式编程的优势和劣势分别是什么?优势:①不可变性 ②并行操作 ③执行顺序更灵活 ④代码更加简洁纯粹的函数式编程,变量具有不可变性,同一个参数不会在不同场景下得出不同的结果,因此大大增强了系统的稳 ...

  9. Java 8中处理集合的优雅姿势——Stream

    在Java中,集合和数组是我们经常会用到的数据结构,需要经常对他们做增.删.改.查.聚合.统计.过滤等操作.相比之下,关系型数据库中也同样有这些操作,但是在Java 8之前,集合和数组的处理并不是很便 ...

随机推荐

  1. flume 1.4 设置FLUME_CONF_DIR没用

    今天安装Apache Flume 1.4的时候,发现设置了FLUME_CONF_DIR环境变量和flume-env.sh后,运行flume-ng时flume-env.sh中的JAVA_HOME没有生效 ...

  2. Python初学者第七天 字符串及简单操作

    7day 数据类型:字符串 1.定义 字符串是一个有序的字符的集合,用于储存和表示基本的文本信息.单.双.三引号之间的内容称之为字符串: a = ‘hello world!’ b = "你好 ...

  3. Web博文目录

    前言 博客写的多了,自己翻起来也费劲,这里就进行一下整合. 以前设想自己做DBA,做运维,没想到最后还要走开发这条路,干一行就爱一行...学的扎实点,工作起来也会轻松.—— 送给奋斗的自己 1 Jav ...

  4. [EffectiveC++]item33:避免遮掩继承而来的名称。

    先看看: ZT C++ 重载.覆盖和隐藏的区别 http://www.cnblogs.com/jeanschen/p/3405987.html 隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下: ...

  5. 优秀 Java 程序员写代码的风格,不再留坑给别人

    往 期 精 彩 推 荐    [1]Java Web技术经验总结 [2]15个顶级Java多线程面试题及答案,快来看看吧 [3]面试官最喜欢问的十道java面试题 [4]从零讲JAVA ,给你一条清晰 ...

  6. SAP S/4HANA生产订单的BAdI增强点之Initialize方法

    在S/4HANA里创建生产订单时,有一个增强点WORKORDER_UPDATE: 这个CAUFVDB里存放的是生产订单抬头级别的数据: 我们来观察下运行时这个结构里存放的数据. 请大家用我github ...

  7. Ajax向Controller发送请求并接受数据需要注意的一个细节

    想用Ajax想向Controller发送请求和接收返回的字符等等.Controller中要使用@ResponseBody注解. <script type="text/javascrip ...

  8. BZOJ2160:拉拉队排练(Manacher)

    Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训 ...

  9. numpy常用操作

    numpy也可以说是随处可见了. ndarray(np.array),就相当于mxnet 里的ndarray一样,连名字都一样. import numpy as np # 创建 a = np.arra ...

  10. 【转】Android单帧动画Rotate旋转

    项目有一个需求,有一个刷新按钮,上面放着一个常见的静止的刷新圆圈,如下图: 一旦用户按了刷新按钮,需要让这个刷新圆圈转动起来,让用户感觉到程序还在运行着,而不是卡死了. 有两个思路,一是将这个图按照旋 ...