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的流库
从迭代到流的操作 流表面上看起来和集合很类似,都可以让我们转换和获取数据,但是它们之间存在着显著的差异 流并不存储其元素,这些元素可能存储在底层的集合中,或者是按需生成的 流的操作不会修改其数据源 流 ...
随机推荐
- C++11 static_assert
C++11 static_assert C++0x中引入了static_assert这个关键字,用来做编译期间的断言,因此叫做静态断言. 其语法:static_assert(常量表达式,提示字符串). ...
- JavaUtil_04_验证码生成器
一.原理 验证码其实就是随机串.原理上可分为两种: 1.简单的验证码 直接通过字母和数字的ASCII码生成.本文采用的验证码就是这种. 2.复杂的验证码 通过一个随机串,一个指定串(如accesske ...
- SQL Server 数据类型转换函数
T-SQL提供了两个显示转换的函数:CAST函数和CONVERT函数. 1. CAST函数 语法: CAST ( expression AS data_type [ ( length ) ] ) 示例 ...
- tamper-proof 对象 nonextensible对象 sealed对象 frozen对象
tamper-proof 对象JavaScript的缺点之一就是每个对象都可以被相同执行上下文的代码修改,很容易导致意外覆盖,或则一不小心把native 对象覆盖.Ecmascript 5提供了 t ...
- iOS字符串修改及运用
//创建字符串 直接赋值 NSString *lytTest = @"A common string"; 1.获取字符串的长度 NSLog(@"%d",lytT ...
- React 和 Angular 各有什么优缺点,各自又适合什么开发场景?
最近正在学习React,便谈一点自己的浅见. Angular.js首先Angular的背后是Google,所以社区基础是不用担心的,整个生态也已经是非常的完整了,从最基本的Tutorial到Stack ...
- 浅谈如何使用swfupload工具与struts2无缝相接
笔者在网上查找流行的上传组件,swfupload引入眼帘,受到JavaEye的一篇文章启发,历时三天,加以研究,现将心得奉上,献礼JavaEye. 由于笔者才疏学浅,经验匮乏,介绍不深入,仅供菜鸟参考 ...
- spring @Autowired和jdk的@Resource区别
当一个接口只有一个实例时,使用这两个注解的效果是一样的. 当含有两个实例时,非得使用 @Autowired 那么定义的引用类型必须和service实现类定义的名字相同,参照下图 定义第一个servic ...
- 从运维的角度分析使用阿里云数据库RDS的必要性--你不应该在阿里云上使用自建的MySQL/SQL Server/Oracle/PostgreSQL数据库
开宗明义,你不应该在阿里云上使用自建的MySQL or SQL Server数据库,对了,还有Oracle or PostgreSQL数据库. 云数据库 RDS(Relational Database ...
- c#工厂模式与抽象工厂模式
一. 工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中. 工厂方法模式是简单工 ...