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的流库
从迭代到流的操作 流表面上看起来和集合很类似,都可以让我们转换和获取数据,但是它们之间存在着显著的差异 流并不存储其元素,这些元素可能存储在底层的集合中,或者是按需生成的 流的操作不会修改其数据源 流 ...
随机推荐
- ZOJ 3777-Problem Arrangement(状压DP)
B - Problem Arrangement Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %l ...
- The Euler function(线性筛欧拉函数)
/* 题意:(n)表示小于n与n互质的数有多少个,给你两个数a,b让你计算a+(a+1)+(a+2)+......+b; 初步思路:暴力搞一下,打表 #放弃:打了十几分钟没打完 #改进:欧拉函数:具体 ...
- Browsing contexts 浏览器上下文
浏览上下文就是document object 呈现给用户的所在的环境 每一个标签或者窗口都包含一个浏览器上下文,包括iframe frames 每一个browsing context ...
- iOS内置图片瘦身思路整理
一.前言 前段时间注意到我们APP的包大小超过100MB了,所以随口跟老板说了下能否采用字体文件(.ttf)替代PNG图片,老板对应用瘦身很感兴趣因此让我做下技术调研.这篇文章主要是将我们的各个技术方 ...
- How to set up Dynamics CRM 2011 development environment
Recently I have been starting to learn Microsoft Dynamics CRM 2011 about implement plugin and workfl ...
- 不想再被鄙视?那就看进来! 一文搞懂Python2字符编码
程序员都自视清高,觉得自己是创造者,经常鄙视不太懂技术的产品或者QA.可悲的是,程序员之间也相互鄙视,程序员的鄙视链流传甚广,作为一个Python程序员,自然最关心的是下面这幅图啦 我们项目组一值使用 ...
- css基础-选择器
CSS选择符(选择器) 一.各类选择器 选择符表示要定义样式的对象,可以是元素本身,也可以是一类元素或者制定名称的元素. 常用的选择符有十种左右 类型选择符,id选择符,class选择符,通配符,群组 ...
- 【转】Linux下软、硬链接的创建和删除
原文:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/10/05/2199534.html 在Linux系统中,内核为每一个新创建的文件分 ...
- python 多线程批量传文件
#!/usr/bin/env python #_*_ coding:utf-8 -*-#autho:leiyong#time:2017-06-05#version: 1.3 import parami ...
- openSUSE 13.1 搭建 DNS服务器
1. Setup Primary DNS Server Install bind9 BIND (Berkely Internet Name Domain) is a software for tran ...