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.什么是 ...
随机推荐
- xp sql2000 安装SP4失败解决方案
环境:xp sp3 SQL: sql2000sql2000 SP4下载链接: http://www.microsoft.com/downloads/details.aspx?familyid=8E2D ...
- Excel导入MS SQL SERVER 操作
关于Excel导入到sql操作的相关问题总结: 一.大批量数据导入 方法1.从Excel大批量数据导入时我们可以使用sql里面有一个batch copy的功能 方法2.在sql中建一个table ty ...
- 客户端负载均衡Ribbon之二:Loadbalance的源码
Load Balance负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法. 像nginx可以使用负载均衡分配流量,ribbon为客户端提供负载均衡,dubbo服务调用里的负载均衡 ...
- [转][CentOS]VI编辑器使用
参考:https://blog.csdn.net/qq_34160679/article/details/79800584 参考:https://www.cnblogs.com/mondol/p/vi ...
- sleep function error ("Advanced Programming in the UNIX Environment" Third Edition No.374)
测试证明代码: #include <unistd.h> #include <fcntl.h> #include <time.h> #include "ap ...
- IP地址基础
第一台计算机的名字 1946年2月14日,世界上第一台电脑ENIAC在美国宾夕法尼亚大学诞生,名叫ENIAC(爱尼阿克). 第一个网络的名字: arpanet 计算机网络定义: 物理位置不同.功能 ...
- [UE4]封装蓝图函数Print String
World Context Object一定要赋值才会在多人游戏中出现Server和Client,如下图所示:
- [UE4]更新UI的三种方式
一.函数绑定 二.属性绑定 只会列出匹配的数据类型. 三.事件驱动更新 啦啦啦啦啦 结论:函数和属性绑定的原理都是每帧都去调用绑定的函数/属性,效率比较低下,一般不推荐使用.事件驱动更新的效率最好,性 ...
- SCCM2012 R2实战系列之五:发现方法
打开SCCM2012的控制台 点击左侧栏的“管理”选项,然后展开“层次结构配置”,点击“发现方法”来配置客户端发现. 勾选“启用Active Directory林发现”.“发现Active Direc ...
- Webbrowser中IHTMLElement、IHTMLElement2、IHTMLDocument2、IHTMLDocument2属性介绍
一.IHTMLElement接口 ele.click -----------点击事件 ele.setAttribute(const strAttributeName: WideStri ...