Java SE 8 流库(二)
1.3. filter,map,flatMAP方法
流的转换会产生一个新流,它的元素派生出自另一个流中的元素;
Stream<T> filter(Predicate<? super T> predicate) 返回一个包含此流中与某种条件相匹配的流
<R> Stream<R> map(Function<? super T,? extends R> mapper) 返回由将给定函数应用于此流的元素的结果组成的流。
<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper) 返回一个流,该流包含将此流的每个元素替换为通过将所提供的映射函数应用于每个元素而生成的映射流的内容的结果。每个映射流在其内容被放置到这个流之后关闭(如果映射流为空,则使用空流)。
1.3.1. filter方法
Filter转换产生一个新流,它的元素与某种条件相匹配;
String contents = new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
List<String> words = Arrays.asList(contents.split("\\PL+"));
//filter转换会产生一个流(值包含长单词的另一个流)
Stream<String> newStream = words.stream()
.filter(w -> w.length() > 6);
1.3.2. map方法
在使用map时,会有一个函数应用到每个元素上,并且其结果包含了应用该函数后所产生的所有结果流;
String contents = new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
List<String> words = Arrays.asList(contents.split("\\PL+"));
//map按照某种方式来转换流中的值
Stream<String> mapStream = words.stream().map(String::toUpperCase);
List<String> list = mapStream.limit(10)
.collect(Collectors.toList());
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
1.3.3. flatmap方法
String contents = new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
List<String> words = Arrays.asList(contents.split("\\PL+"));
Stream<String> result = words.stream()
.flatMap(w -> letters(w));
show(result); public static Stream<String> letters(String s){ ArrayList<String> result = new ArrayList<>();
for(int i=0;i<s.length();i++){
result.add(s.substring(i,i+1));
}
return result.stream();
} public static <T> void show( Stream<T> stream){
List<T> list = stream.limit(10)
.collect(Collectors.toList());
for(int i=0;i<list.size();i++){ System.out.println(list.get(i));
}
}
1.4. 抽取子流和连接流
Stream<T> limit(long maxSize) 返回由此流的元素组成的流,截断长度不超过maxSize。
Stream<T> skip(long n) 丢弃流的前n个元素之后,返回由该流的其余元素组成的流。 如果这个流包含少于n个元素,那么将返回一个空的流。
static <T> Stream<T> concat(Stream<? extends T> a,Stream<? extends T> b) 创建一个延迟连接的流,其元素是第一个流的所有元素,后跟第二个流的所有元素。 如果两个输入流都是有序的,则生成的流是有序的;如果任意一个输入流是并行的,则生成的流是并行的。 当结果流关闭时,调用两个输入流的关闭处理程序。
/**
* Created by Lenovo on 2017/12/18.
* 抽取子流和链接流
*/
public class Demo07 { private static final String filePath = "G:\\Idea\\src\\com\\itheima05\\Test_JavaSE\\Test_20171214\\word.txt"; public static void main(String[] args) throws Exception { String contents = new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
List<String> words = Arrays.asList(contents.split("\\PL+")); //包含有10个随机数的流
Stream<Double> random = Stream.generate(Math::random).limit(10);
show(random); //split,丢弃前n个元素
Stream<String> skip = words.stream().skip(5);
show(skip); //concat将两个流连接起来
Stream<String> concat = Stream.concat(letters("Hello"), letters("World"));
show(concat);
}
public static <T> void show( Stream<T> stream){
List<T> list = stream.limit(10)
.collect(Collectors.toList());
for(int i=0;i<list.size();i++){ System.out.println(list.get(i));
}
}
public static Stream<String> letters(String s){ ArrayList<String> result = new ArrayList<>();
for(int i=0;i<s.length();i++){
result.add(s.substring(i,i+1));
}
return result.stream();
}
}
1.5. 其他流转换
Stream<T> distinct() 返回由此流的不同元素(根据Object.equals(Object))组成的流。
Stream<T> sorted() 返回由此流的元素组成的流,按照自然顺序排序。如果此流的元素不是Comparable,执行终端操作时可能会抛出java.lang.ClassCastException。
Stream<T> peek(Consumer<? super T> action) 返回由此流的元素组成的流,另外对每个元素执行提供的操作,因为元素将从结果流中消耗。这是一个中间操作。
/**
* Created by Lenovo on 2017/12/18.
* 其他转换流
*/
public class Demo06 { public static void main(String[] args) { //将原有的流去重,获取一个新流
Stream<String> distinct = Stream.of("aaa", "bbb", "ccc", "sss", "aaa").distinct();
show(distinct); //sorted,倒序排序
Stream<String> sorted = Stream.of("aaa", "aa", "aaaa", "a", "aaaaa")
.sorted(Comparator.comparing(String::length).reversed());
show(sorted); //peek
Object[] peek = Stream.iterate(1.0, p -> p * 2)
.peek(e -> System.out.println("fetching" + e))
.limit(20).toArray();
for(int i = 0;i<peek.length;i++){
System.out.println(peek[i]);
}
} public static <T> void show(Stream<T> stream){
List<T> tList = stream.limit(10).collect(Collectors.toList());
for(int i =0;i<tList.size();i++){
System.out.println(tList.get(i));
}
}
}
结果输出:
aaa
bbb
ccc
sss
aaaaa
aaaa
aaa
aa
a
fetching1.0
fetching2.0
fetching4.0
fetching8.0
fetching16.0
fetching32.0
fetching64.0
fetching128.0
fetching256.0
fetching512.0
fetching1024.0
fetching2048.0
fetching4096.0
fetching8192.0
fetching16384.0
fetching32768.0
fetching65536.0
fetching131072.0
fetching262144.0
fetching524288.0
1.6.简单约简
约简是一种终结操作,它们会将流约简为可以在程序中使用的非流值;
例如:count,max,min都是简单约简,这些返回的是一个数据类型Optional<T>
Optional<T> max(Comparator<? super T> comparator) 根据提供的比较器返回此流的最大元素。
Optional<T> min(Comparator<? super T> comparator) 根据提供的比较器返回此流的最小元素。
Optional<T> findAny() 返回一个描述流的某个元素的可选项,如果流为空,则返回一个空的可选项。
Optional<T> findFirst() 返回描述此流的第一个元素的可选项,如果流为空,则返回一个空的可选项。 如果流没有遇到命令,则可以返回任何元素;
noneMatch和allMatch它们分别会在所有元素和没有任何元素匹配断言的情况下返回true
boolean allMatch(Predicate<? super T> predicate)
boolean noneMatch(Predicate<? super T> predicate)
boolean anyMatch(Predicate<? super T> predicate)
/**
* Created by Lenovo on 2017/12/20.
* java.util.Optional<T>
* public T orElse(T other) 返回值如果存在,否则返回其他。
* java.lang.String
* public int compareToIgnoreCase(String str) 按字母顺序比较两个字符串,忽略大小写的差异。
*
*/
public class Demo08 { private static final String filePath = "G:\\Idea\\src\\com\\itheima05\\Test_JavaSE\\Test_20171214\\word.txt"; public static void main(String[] args) throws Exception { String contents = new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
List<String> words = Arrays.asList(contents.split("\\PL+")); //获取流中的最大值
Optional<String> largest = words.stream().max(String::compareToIgnoreCase);
System.out.println("largest:"+largest.orElse("")); //显示已字母为"Q"开头的单词
Optional<String> firstWords = words.stream().filter(s -> s.startsWith("Q")).findFirst();
System.out.println("firstWords:"+firstWords.orElse("")); //显示有字母为"Q"的单词
Optional<String> anyWords = words.stream().filter(s -> s.startsWith("Q")).findAny();
System.out.println("anyWords:"+anyWords.orElse("")); //判断是否匹配
boolean anyMatch = words.parallelStream().anyMatch(s -> s.startsWith("Q"));
System.out.println("anyMatch:"+anyMatch); boolean noneMatch = words.parallelStream().noneMatch(s -> s.startsWith("Q"));
System.out.println("noneMatch:"+noneMatch); boolean allMatch = words.parallelStream().allMatch(s -> s.startsWith("Q"));
System.out.println("allMatch:"+allMatch);
}
}
Java SE 8 流库(二)的更多相关文章
- Java SE 8 流库
1. 流的作用 通过使用流,说明想要完成什么任务,而不是说明如何去实现它,将操作的调度留给具体实现去解决: 实例:假如我们想要计算某个属性的平均值,那么我们就可以指定数据源和属性,然后,流库就可以对计 ...
- Java SE 8 流库(一)
1. 流的作用 通过使用流,说明想要完成什么任务,而不是说明如何去实现它,将操作的调度留给具体实现去解决: 实例:假如我们想要计算某个属性的平均值,那么我们就可以指定数据源和属性,然后,流库就可以对计 ...
- Java SE 8 流库(四)
1.8. 收集数据 <R,A> R collect(Collector<? super T,A,R> collector) 使用给定的收集器来收集当前流中的元素 void ...
- Java SE 8 流库(三)
1.7. Optional类型 容器对象,可能包含或不包含非空值.如果存在一个值,isPresent()将返回true,get()将返回值.还提供了依赖于包含值是否存在的附加方法,如orElse()( ...
- Java I/O流操作(二)---缓冲流[转]
转自:http://blog.csdn.net/johnny901114/article/details/8710403 一.BufferWriter类 IO的缓冲区的存在就是为了提高效率,把要操作的 ...
- Java:IO流(二)——InputStream/OutputStream具体用法:FileXXXStream、ByteArrayXXXStream
1.说明 InputStream和OutputStream是Java标准库中最基本的IO流,它们都位于java.io包中,该包提供了所有同步IO的功能. 2.模块:java.io.InputStrea ...
- JAVA基础-IO流(二)
一.字节流 字节流是通过字节来进行读写操作的,他的使用对象相比于字符流来说更加的广泛.这主要是因为他们读写文件的方式而决定的.字符流读写文件时是将读取到的字节通过默认编码表转换成字符,在通过默认编码表 ...
- 海康威视摄像机Java SDK拉流(二)开启关闭实时预览
本篇介绍海康威视摄像机通过SDK开启关闭实时预览接口 下篇介绍实时预览的回调函数及解码库 测试环境: 系统:Centos 7 SDK:设备网络SDK Linux64 实时预览模块流程: 图中虚线框部分 ...
- 第01章-Java SE8的流库
从迭代到流的操作 流表面上看起来和集合很类似,都可以让我们转换和获取数据,但是它们之间存在着显著的差异 流并不存储其元素,这些元素可能存储在底层的集合中,或者是按需生成的 流的操作不会修改其数据源 流 ...
随机推荐
- Mysql修改已有数据的字符集
Mysql修改已有数据的字符集 问题 在生产环境中跑了很久,发现MysqlClient连接的字符集是默认的latin1,我们一直以为都是utf8,造成这样的误解,是因为在内网环境中,我们是源码编译的M ...
- java三级考试理论题
Java试卷 一.单项选择题: 1. 试题: 在WINDOWS环境下,ODBC在__A____中设置 A. 控制面板 B. 注册表 C. 浏览器 D. 写字板 2. 阅读以下描述: C <jsp ...
- form 表单处理
submit相关 当使用 submit 按钮或者 image 或者button type="submit" 来提交表单时,会触发 submit 事件,但是直接javascri ...
- ⑦bootstrap按钮 图片 辅助使用基础案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SignalR实现消息推送,包括私聊、群聊、在线所有人接收消息(源码)
一.关于SignalR 1.简介:Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面, ...
- 使用Docker安装Mysql
最近使用阿里云服务器,学习一下Docker,今天学着使用Docker安装MySQL. 首先,从阿里云的Docker Hub 上pull一个MySQL的image. [centos@loovelj~]$ ...
- 插件lombok的介绍安装
Lombok插件 介绍一个不错的Eclipse插件Lombok 该插件对Log4j简化的代码,因为不大,所以jar包也存在呢! Lombox是Eclipse的一个插件,用来自动生成Java代码,减少手 ...
- Mysql Explain 解读(基于MySQL 5.6.36)
Mysql Explain 解读(基于MySQL 5.6.36) 1.语法 explain < table_name > #例子 explain select * from t3 wher ...
- Linux命令学习备忘
格式: 命令:原理:实践及截图 1.su <user> 执行该命令,需要输入password,它是<user>中定义的用户的password,即,要变换成的用户的passw ...
- node.js安装——Windows7系统下的安装及其环境部署——特别详细
作为一个前端的菜鸟同学,之间也没学过什么框架,目前公司做项目,所用到的webpack+node.js+vue. 首先,关于node的环境部署方面,建议官网安装node.js,最好不要安装非稳定版的版本 ...