Java SE 8 流库(二)

时间:2022-06-03 05:10:11

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 流库(二)的更多相关文章

  1. Java SE 8 流库

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

  2. Java SE 8 流库(一)

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

  3. Java SE 8 流库(四)

    1.8. 收集数据 <R,A> R collect(Collector<? super T,A,R> collector)   使用给定的收集器来收集当前流中的元素 void ...

  4. Java SE 8 流库(三)

    1.7. Optional类型 容器对象,可能包含或不包含非空值.如果存在一个值,isPresent()将返回true,get()将返回值.还提供了依赖于包含值是否存在的附加方法,如orElse()( ...

  5. Java I&sol;O流操作&lpar;二&rpar;---缓冲流&lbrack;转&rsqb;

    转自:http://blog.csdn.net/johnny901114/article/details/8710403 一.BufferWriter类 IO的缓冲区的存在就是为了提高效率,把要操作的 ...

  6. JAVA基础-IO流(二)

    一.字节流 字节流是通过字节来进行读写操作的,他的使用对象相比于字符流来说更加的广泛.这主要是因为他们读写文件的方式而决定的.字符流读写文件时是将读取到的字节通过默认编码表转换成字符,在通过默认编码表 ...

  7. 海康威视摄像机Java SDK拉流(二)开启关闭实时预览

    本篇介绍海康威视摄像机通过SDK开启关闭实时预览接口 下篇介绍实时预览的回调函数及解码库 测试环境: 系统:Centos 7 SDK:设备网络SDK Linux64 实时预览模块流程: 图中虚线框部分 ...

  8. 第01章-Java SE8的流库

    从迭代到流的操作 流表面上看起来和集合很类似,都可以让我们转换和获取数据,但是它们之间存在着显著的差异 流并不存储其元素,这些元素可能存储在底层的集合中,或者是按需生成的 流的操作不会修改其数据源 流 ...

  9. Java高级特性1&lowbar;流库&lowbar;初体验

    Java高级特性流库_初体验 面对结果编程 在编程里, 有两种编程方式, 一种是面对过程编程, 一种是面对结果编程. 两者区别如下 面向过程编程 面向过程编程需要编程程序让程序依次执行得到自己想要的结 ...

随机推荐

  1. python的字符串内建函数

    http://www.ziqiangxuetang.com/python/python-strings.html

  2. python-mysqldb安装

    出现错误  command 'gcc' failed with exit status 1 解决办法: yum install python-devel mysql-devel zlib-devel ...

  3. EF更新,数据库值变化,前台页面并不变化,刷新也不变化,重新运行程序则变化----开发中遇到的问题(已解决)

    首先说一下我遇到这个情况的代码情景,首先上错误代码 UserInfo userInfo = Session["UserInfo"] as UserInfo; ); 这段代码所呈现的 ...

  4. 多重背包的入门题目HDU1171&comma;2191&comma;2844&period;

    首先,什么叫多重背包呢? 大概意思就是:一个背包有V总容量,有N种物品,其价值分别为Val1,Val2--,Val3,体积对应的是Vol1,Vol2,--,Vol3,件数对应Num1,Num2--,N ...

  5. django xadmin 1不在可用的选项中

    报错:1不在可用的选项中 解决办法: 对CharField的choices的选项, gender = models.CharField(max_length=, choices=((, , &quot ...

  6. 处理MySQL的ibdata1文件过大问题

    ibdata1文件是什么? ibdata1是一个用来构建innodb系统表空间的文件,这个文件包含了innodb表的元数据.撤销记录.修改buffer和双写buffer.如果file-per-tabl ...

  7. SCRUM 12&period;20

    以下为我们爬虫遇到问题的报告 我们团队的m2阶段原本计划是爬取美团的信息以支持我们的app对比功能,但在这一阶段遇到很多问题,主要表现如下: 美团反爬机制: 由于我们团队人员在事先并不知道美团具有反爬 ...

  8. 【原创】angularjs1&period;3&period;0源码解析之执行流程

    Angular执行流程 前言 发现最近angularjs在我厂的应用变得很广泛,下周刚好也有个angular项目要着手开始做,所以先做了下功课,从源代码开始入手会更深刻点,可能讲的没那么细,侧重点在于 ...

  9. Linux 下安装JDK和jmeter 及环境配置记录过程

    一.安装首先要查看linux系统的位数,用命令getconf LONG_BIT,我的是centOS 32位 二.官网下载32位的JDK8 http://www.oracle.com/technetwo ...

  10. ubuntu 16&period;04换源 网易、搜狐、阿里云

    如何更改源可以在软件更新中选择源 使用如下命令更改(修改前先备份): [html] view plain copy print?sudo cp /etc/apt/source.list /etc/ap ...