流的转换, 按照条件过滤/映射/摊平/截取/丢弃/连接/去重/排序。

辅助方法

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的流库 --- 转换流, 得到的还是流的更多相关文章

  1. Java SE 8 流库(二)

    1.3. filter,map,flatMAP方法 流的转换会产生一个新流,它的元素派生出自另一个流中的元素: Stream<T> filter(Predicate<? super ...

  2. J2SE 8的流库 --- 基本类型流的使用

    展现流的方法 public static <T> void show(String title, Stream<T> stream){ System.out.println(& ...

  3. Java SE 8 的流库学习笔记

    前言:流提供了一种让我们可以在比集合更高的概念级别上指定计算的数据视图.如: //使用foreach迭代 long count = 0; for (String w : words) { if (w. ...

  4. C#处理文件流的转换

    //----引入必要的命名空间 using System.IO; using System.Drawing.Imaging; //----代码部分----// private byte[] photo ...

  5. Java IO流之转换流

    一.转换流 1.在IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换流 2.转换流用于在字节流和字符流之间转换 3.转换流本身是字符流 二.两种转换流 Ou ...

  6. Java SE 8 流库

    1. 流的作用 通过使用流,说明想要完成什么任务,而不是说明如何去实现它,将操作的调度留给具体实现去解决: 实例:假如我们想要计算某个属性的平均值,那么我们就可以指定数据源和属性,然后,流库就可以对计 ...

  7. IO流(File类,IO流的分类,字节流和字符流,转换流,缓冲流,对象序列化)

    1.File类 File类可以在程序中 操作文件和目录.File类是通过建立File类对象,在调用File类的对象来进行相关操作的. 示例: public class Demo01 { public  ...

  8. 我爱Java系列之《JavaEE学习笔记day12》---【缓冲流、转换流、序列/反序列化流、打印流】

    [缓冲流.转换流.序列/反序列化流.打印流] 一.缓冲流 1.字节缓冲输出流 java.io.BufferedOutputStream extends OutputStream 高效字节输出流 写入文 ...

  9. Java-IO流之转换流的使用和编码与解码原理

    一.理论: 1.字符流和字节流区别是什么? 字符流=字节流+编码集,在实际读取的时候其实字符流还是按照字节来读取,但是会更具编码集进行查找编码集字典解析相应的字节,使得一次读取出一个字符: 2.什么是 ...

随机推荐

  1. asp.net利用HttpModule实现防sql注入和加载样式和JS文件

    1.新建一个类,实现IHttpModule接口 代码如下: public class SqlHttpModule : IHttpModule { public void Dispose() { } p ...

  2. Web jsp开发学习——实现页面跳转和传参

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...

  3. NodeJs使用async让代码按顺序串行执行

    描述 由于nodejs中的函数调用都是异步执行的,而笔者在工程开发中函数A需要四五个参数,而这四五个参数值都是通过函数调用获得,因此按顺序写代码时,执行到函数A时,往往函数A需要的参数值因为参数的异步 ...

  4. 在Ubuntu16.04下面安装asterisk网络电话交换机服务器

    在Ubuntu下面需要安装 apt install libncurses5-dev uuid-dev libjansson-dev libxml2-dev libsqlite3-dev 去官网下载包h ...

  5. 如何获取阿里云OSS上每个文件夹的大小

    原文 https://help.aliyun.com/document_detail/88458.html?spm=a2c4g.11186623.2.11.792462b15oU02q OSS文件按照 ...

  6. 【TensorFlow学习笔记 】name_socpe variable_scope

    [引言]TensorFlow中的命名域是非常重要的概念,涉及到参数共享,方便命名参数管理,定义图结构 本文主要介绍name_scope 和 variable_scope,slim包中的arg_scop ...

  7. mac一些设置

    Mac自带了的JDK6,安装在目录:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/下. JDK8则需要自己到Oracle官网下载安装对应的版本. ...

  8. U3D学习07-插值运算(位移与旋转)

    1.Lerp 线性插值计算.匀速移动 2.LerpAngle 线性插值计算.匀速旋转 3.MoveTowards  4.MoveTowardsAngel  5.SmoothStep非匀速移动  6.S ...

  9. 梯度下降(Gradient Descent)相关概念

    梯度,直观理解: 梯度: 运算的对像是纯量,运算出来的结果会是向量在一个标量场中, 梯度的计算结果会是"在每个位置都算出一个向量,而这个向量的方向会是在任何一点上从其周围(极接近的周围,学过 ...

  10. kafka producer实例

    1. 定义要发送的消息User POJO package lenmom.kafkaproducer; public class User { public String name; public in ...