Java 8 中有趣的操作 Stream
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();
流看上去有点像是集合,转换或者获取数据,不过有一定的差异性
- 流不会存储元素,,这些元素可能是 储存在底层的集合中,或者按需生成的
- 流的操作不会修改其数据源 比如filter会生成一个新的流
- 流的操作尽可能是惰性执行的
创建:可以使用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的更多相关文章
- java 8中构建无限的stream
目录 简介 基本使用 自定义类型 总结 java 8中构建无限的stream 简介 在java中,我们可以将特定的集合转换成为stream,那么在有些情况下,比如测试环境中,我们需要构造一定数量元素的 ...
- Java 8中用法优雅的Stream,性能也"优雅"吗?
之前的文章中我们介绍了Java 8中Stream相关的API,我们提到Stream API可以极大提高Java程序员的生产力,让程序员写出高效率.干净.简洁的代码. 那么,Stream API的性能到 ...
- java集合框架之聚合操作stream
参考http://how2j.cn/k/collection/collection-aggregate/702.html#nowhere 聚合操作 JDK8之后,引入了对集合的聚合操作,可以非常容易的 ...
- 在java程序中,对于数据的输入/输出操作以“流”(stream)方式进行
在java程序中,对于数据的输入/输出操作以“流”(stream)方式进行
- 详解Java 8中Stream类型的“懒”加载
在进入正题之前,我们需要先引入Java 8中Stream类型的两个很重要的操作: 中间和终结操作(Intermediate and Terminal Operation) Stream类型有两种类型的 ...
- Java中使用Jedis操作Redis(转载)
整理 1.字符串 添加:set keyname value 查询:get keyname 拼接:append keyname value 删除:del keyname 添加多个: mset keyna ...
- 使用Java 8中的Stream
Stream是Java 8 提供的高效操作集合类(Collection)数据的API. 1. 从Iterator到Stream 有一个字符串的list,要统计其中长度大于7的字符串的数量,用迭代来实现 ...
- Java 8中Stream API学习笔记
1)函数式编程的优势和劣势分别是什么?优势:①不可变性 ②并行操作 ③执行顺序更灵活 ④代码更加简洁纯粹的函数式编程,变量具有不可变性,同一个参数不会在不同场景下得出不同的结果,因此大大增强了系统的稳 ...
- Java 8中处理集合的优雅姿势——Stream
在Java中,集合和数组是我们经常会用到的数据结构,需要经常对他们做增.删.改.查.聚合.统计.过滤等操作.相比之下,关系型数据库中也同样有这些操作,但是在Java 8之前,集合和数组的处理并不是很便 ...
随机推荐
- Spring注解开发-全面解析常用注解使用方法之组件注册
目录 1. @Configuration 2. @ComponentScan excludeFilters includeFilters 使用自定义TypeFilter 3. @Bean @Scope ...
- 设计模式:组合(Composite)模式
设计模式:组合(Composite)模式 一.前言 关于Composite模式,其实就是组合模式,又叫部分整体模式,这个模式在我们的生活中也经常使用,比如说如果读者有使用Java的GUI编写过程序 ...
- 使用mysli防止sql注入
自从 php5 推出 mysqli 后就开始不提倡使用 mysql_ 开头的接口了,现在使用 mysql_connet 通常调试的时候会报警告说这个不该用 mysqli 使用起来其实更简单 $url ...
- 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.4.JVM工具
1.概述 工具作用:性能监控与故障处理 工作原理:分析数据 数据包含:运行日志. 异常堆栈. GC日志. 线程快照(threaddump/javacore文件). 堆转储快照(heapdump/hpr ...
- Java Web技术经验总结
接口的权限认证,使用拦截器(HandlerInterceptorAdapter),参考:第五章 处理器拦截器详解——跟着开涛学SpringMVC.注意:推荐能使用servlet规范中的过滤器Filte ...
- Ace admin 如何实现类似于freamset加载页面
如上标题所述,ace admin做后台页面的时候,可以实现类似于用freamset的功能,但是ace admin做的比freamset更好,他可以用异步加载的形式展示,而加载的页面的内容可以尽可能的少 ...
- Vue-Quill-Editor插件插入图片的改进
最近在做一个Vue-Clie小项目,使用到了Vue-Quill-Editor这个基于Vue的富文本编辑器插件.这个插件跟Vue契合良好,使用起来比其他的诸如百度UEditor要方便很多,但是存在一个小 ...
- IntelliJ IDEA 2017.3-2018.1 全系列汉化包
JetBrains 系列软件汉化包 关键字: Android Studio 3.0-3.1 汉化包 GoLand 2017.3.2-2018.1 汉化包 IntelliJ IDEA 2017.3-20 ...
- CTSC2018 && APIO2018 && SDOI2018R2游记
Day -? 占个坑先.希望CTSC,APIO别打铁,R2别滚粗QAQ CTSC Day 0 早起坐车睡觉颓废报道颓废 反正游记就是咕懒得写了 Day 1 早上四点被xp的闹钟吵醒(???还两次) 幸 ...
- isset() 与 array_key_exists() 比较
1.对于数组值的判断不同,对于值为null或''或false,isset返回false,array_key_exists返回true: 2. 执行效率不同,isset是内建运算符,array_key_ ...