J2SE 8的流库 --- 转换流, 得到的还是流
流的转换, 按照条件过滤/映射/摊平/截取/丢弃/连接/去重/排序。
辅助方法
public static int myCompare(String x, String y) {
if(x.length()>y.length()){
return 1;
}else if(x.length()==y.length()){
return x.compareTo(y);
}else{
return -1;
}
}
private static Stream<Integer> letters(String s){
return s.chars().boxed(); //将所有的chars抽成流
}
public static <T> void show(String title, Stream<T> stream){
System.out.println("title:"+title);
List<T> collect = stream.limit(10).collect(Collectors.toList());
collect.forEach(n->System.out.println(n));
System.out.println();
}
//????
@SuppressWarnings("unchecked")
public static <T extends Stream<?>> void deepShow(String title, T stream){
System.out.println("title:"+title);
stream.forEach(n->{
if(n instanceof Stream){
deepShow(title, (T)n);
}else{
System.out.println(n);
}
});
System.out.println();
}
1. 过滤 filter() Predicate<? super T> predicate T->boolean 按照特定条件过滤
Stream<String> filterStream = arrayList.stream().filter((w)->(w.length()>2));
show("filterStream", filterStream);
2. 映射 map() Function<? super T, ? extends R> mapper T->R 按照特定方式转换
Stream<String> mapStream = arrayList.stream().map(String::toUpperCase);
show("mapStream", mapStream);
3. 摊平 flatMap() 包含流的流 摊平
Stream<Stream<Integer>> flatStream = arrayList.stream().map(w->letters(w));
deepShow("flatStream", flatStream);
//==>摊平
Stream<Integer> flatMapStream = arrayList.stream().flatMap(w->letters(w));
flatMapStream.forEach(n->System.out.println((char)(int)n));
System.out.println();
4. 截取 limit(n) 在n个元素后结束
Stream<String> limitStream = arrayList.stream().limit(2);
show("limitStream", limitStream);
5. 丢弃 skip(n) 丢弃前n个元素
Stream<String> skipStream = arrayList.stream().skip(2);
show("skipStream", skipStream);
6. 连接 Stream.concat() 将两个流连接起来,第一个流不能是无限流,否则第二个流没有处理的机会
Stream<String> concatStream = Stream.concat(arrayList.stream(), Stream.of("aa","bb","cc"));
show("concatStream", concatStream);
7. 去重 distinct() 剔除重复元素
Stream<String> distinctStream = Stream.of("aa","bb","cc","aa").distinct();
show("distinctStream", distinctStream);
8. 排序 sorted() 按照默认排序或者传入比较器
//(1) 按照默认排序, 字典顺序比较
Stream<String> sortedStream = Stream.of("aa","bb","cc","aa").sorted();
show("sortedStream", sortedStream);
sortedStream = Stream.of("aa","b1b","c22c","a33a","a4444b","a55555B").sorted(Comparator.comparing(x->x)); //提取Comparator进行排序
show("sortedStream", sortedStream);
//(2) 传入String的比较器
//1) 字典顺序比较
sortedStream = Stream.of("aa","bb","cc","aa","ab","aB").sorted(String::compareTo);
show("sortedStream", sortedStream);
sortedStream = Stream.of("aa","bb","cc","aa","ab","aB").sorted((x,y)->x.compareTo(y));
show("sortedStream", sortedStream);
//2) 比较length
sortedStream = Stream.of("aa","b1b","c22c","a33a","a4444b","a55555B").sorted(Comparator.comparing(String::length)); //提取Comparator进行排序
show("sortedStream", sortedStream);
sortedStream = Stream.of("aa","b1b","c22c","a33a","a4444b","a55555B").sorted((x,y)->Integer.compare(x.length(), y.length()));
show("sortedStream", sortedStream);
//3) 传入比较器 比较多个条件
sortedStream = Stream.of("aa","bb","cc","aa","ab","aB").sorted(
(x, y)->{
if(x.length()>y.length()){
return 1;
}else if(x.length()==y.length()){
return x.compareTo(y); //字典顺序比较
}else{
return -1;
}
});
show("sortedStream", sortedStream);
sortedStream = Stream.of("aa","bb","cc","aa","ab","aB").sorted(new Comparator<String>() {
@Override
public int compare(String x, String y) {
if(x.length()>y.length()){
return 1;
}else if(x.length()==y.length()){
return x.compareTo(y);
}else{
return -1;
}
}
});
show("sortedStream", sortedStream);
//4) 传入自定义的比较器 比较多个条件
sortedStream = Stream.of("aa","bb","cc","aa","ab","aB").sorted(ConvertStreamTest::myCompare);
show("sortedStream", sortedStream);
//5) 语法糖 比较多个条件
sortedStream = Stream.of("aa","b1b","c22c","a33a","a4444b","a55555B").sorted(Comparator.comparing(String::length).thenComparing(String::compareTo));
show("sortedStream", sortedStream);
//(3) reversed() 指定比较器倒叙
sortedStream = Stream.of("aa","b1b","c22c","a33a","a4444b","a55555B").sorted(Comparator.comparing((String x)->x).reversed());
show("sortedStream", sortedStream);
sortedStream = Stream.of("aa","b1b","c22c","a33a","a4444b","a55555B").sorted(Comparator.comparing(String::length).reversed());
show("sortedStream", sortedStream);
9. 类似代理 peek() 获得每个元素时,做一些事情
Stream<String> peekStream = Stream.of("aa","b1b","c22c","a33a","a4444b","a55555B").peek(x->System.out.println("peek() fetch element: "+x));
show("peekStream", peekStream);
J2SE 8的流库 --- 转换流, 得到的还是流的更多相关文章
- Java SE 8 流库(二)
1.3. filter,map,flatMAP方法 流的转换会产生一个新流,它的元素派生出自另一个流中的元素: Stream<T> filter(Predicate<? super ...
- J2SE 8的流库 --- 基本类型流的使用
展现流的方法 public static <T> void show(String title, Stream<T> stream){ System.out.println(& ...
- Java SE 8 的流库学习笔记
前言:流提供了一种让我们可以在比集合更高的概念级别上指定计算的数据视图.如: //使用foreach迭代 long count = 0; for (String w : words) { if (w. ...
- C#处理文件流的转换
//----引入必要的命名空间 using System.IO; using System.Drawing.Imaging; //----代码部分----// private byte[] photo ...
- Java IO流之转换流
一.转换流 1.在IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换流 2.转换流用于在字节流和字符流之间转换 3.转换流本身是字符流 二.两种转换流 Ou ...
- Java SE 8 流库
1. 流的作用 通过使用流,说明想要完成什么任务,而不是说明如何去实现它,将操作的调度留给具体实现去解决: 实例:假如我们想要计算某个属性的平均值,那么我们就可以指定数据源和属性,然后,流库就可以对计 ...
- IO流(File类,IO流的分类,字节流和字符流,转换流,缓冲流,对象序列化)
1.File类 File类可以在程序中 操作文件和目录.File类是通过建立File类对象,在调用File类的对象来进行相关操作的. 示例: public class Demo01 { public ...
- 我爱Java系列之《JavaEE学习笔记day12》---【缓冲流、转换流、序列/反序列化流、打印流】
[缓冲流.转换流.序列/反序列化流.打印流] 一.缓冲流 1.字节缓冲输出流 java.io.BufferedOutputStream extends OutputStream 高效字节输出流 写入文 ...
- Java-IO流之转换流的使用和编码与解码原理
一.理论: 1.字符流和字节流区别是什么? 字符流=字节流+编码集,在实际读取的时候其实字符流还是按照字节来读取,但是会更具编码集进行查找编码集字典解析相应的字节,使得一次读取出一个字符: 2.什么是 ...
随机推荐
- [转载]领域驱动设计(Domain Driven Design)参考架构详解
摘要 本文将介绍领域驱动设计(Domain Driven Design)的官方参考架构,该架构分成了Interfaces.Applications和Domain三层以及包含各类基础设施的Infrast ...
- scala 基本类型和操作
Scala基本类型 Scala中的基本数据类型如下图: (来源:Programming in scala) 从上表中可以看出,Scala的基本数据类型与Java中的基本数据类型是一一对应的,不同的是 ...
- 问题 H: 老管家的忠诚(线段树)
问题 H: 老管家的忠诚 时间限制: 0 Sec 内存限制: 128 MB提交: 54 解决: 21[提交][状态][讨论版][命题人:外部导入] 题目描述 老管家是一个聪明能干的 ...
- python的导包问题
有事会遇到在python代码中导入包错误问题,本文简单对python包的引入做简单介绍 简单说,我认为python导包一共有3种情况,分别是: 要导的包与当前文件在同一层要导的包在当前文件的底层(就是 ...
- [UE4]自动旋转组件
- PTA2016天梯赛决赛3小时训练赛
7-2 I Love GPLT (5 分) 这道超级简单的题目没有任何输入. 你只需要把这句很重要的话 —— I Love GPLT ——竖着输出就可以了. 所谓“竖着输出”,是指每个字符占一行(包括 ...
- UI 性能因素考虑
浏览器的最大并发连接数一般在4到6之间,首先了解影响加载的性能因素: (1)下载的文件太大 (2)发出的请求太多 (3)请求相应不及时 针对这些因素,一般会考虑减少请求次数: (1)对静态文件设置缓存 ...
- tensorFlow 三种启动图的用法
tf.Session(),tf.InteractivesSession(),tf.train.Supervisor().managed_session() 用法的区别: tf.Session() 构 ...
- OpenCV安装教程(Ubuntu 18.04)
视频教程 带字幕版: https://www.youtube.com/watch?v=0vjC2UHptU4 无带字幕版:https://fzhshared-1252154746.cos.ap-gua ...
- 第11章 拾遗4:IPv6(3)_配置IPv6路由
5. 配置IPv6路由 5.1 配置IPv6静态路由 (1)在路由器上配置静态路由(以R1路由器为例) //静态路由 R1#config t R1(config)#ipv6 unicast-routi ...