Stream:java1.8新特性
Stream:java1.8新特性
kekeair-zhang
阅读数:392
													<span class="tags-box artic-tag-box">
							<span class="label">标签:</span>
															<a data-track-click="{"mod":"popu_626","con":"stream"}" class="tag-link" href="http://so.csdn.net/so/search/s.do?q=stream&t=blog" target="_blank">stream																</a><a data-track-click="{"mod":"popu_626","con":"java1-8新特性"}" class="tag-link" href="http://so.csdn.net/so/search/s.do?q=java1-8新特性&t=blog" target="_blank">java1-8新特性																</a>
						<span class="article_info_click">更多</span></span>
																				<div class="tags-box space">
							<span class="label">个人分类:</span>
															<a class="tag-link" href="https://blog.csdn.net/ke_zhang_123/article/category/7023245" target="_blank">日记																</a>
						</div>
																							</div>
			<div class="operating">
													</div>
		</div>
	</div>
</div>
<article>
	<div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post">
							<div class="article-copyright">
				版权声明:本文为博主原创文章,未经博主允许不得转载。					https://blog.csdn.net/ke_zhang_123/article/details/76549410				</div>
							            <div class="markdown_views">
						<!-- flowchart 箭头图标 勿删 -->
						<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
						<h2 id="streamjava18新特性"><a name="t0"></a><strong>Stream:java1.8新特性</strong></h2>
what?(它是什么)
stream流,Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返. 
Stream 可以并行化操作,使用并行去遍历时,数据会被分成多个段,其中每一个都在不同的线程中处理,然后将结果一起输出。Stream的并行操作依赖于 Java7 中引入的 Fork/Join 框架(JSR166y)来拆分任务和加速处理过程。
why?(为什么使用它)
但在当今这个数据大爆炸的时代,在数据来源多样化、数据海量化的今天,很多时候不得不脱离 RDBMS,或者以底层返回的数据为基础进行更上层的数据统计 
更多的时候是程序员需要用 Iterator 来遍历集合,完成相关的聚合应用逻辑.但是效率很低 
而使用stream使用并发模式,程序执行速度更快.
how?(怎么做)
一、流的初始化与转换:
Java中的Stream的所有操作都是针对流的,所以,使用Stream必须要得到Stream对象: 
  1.初始化一个流:
Stream stream = Stream.of("a", "b", "c");
- 1
 
2.数组转换为一个流:
String [] strArray = new String[] {"a", "b", "c"};
    stream = Stream.of(strArray);
- 1
 - 2
 
或者
- 1
 
stream = Arrays.stream(strArray);
- 1
 
3.集合对象转换为一个流(Collections):
List<String> list = Arrays.asList(strArray);
    stream = list.stream();
- 1
 - 2
 
二、流的操作:
流的操作可以归结为几种:
1.遍历操作(map):
使用map操作可以遍历集合中的每个对象,并对其进行操作,map之后,用.collect(Collectors.toList())会得到操作后的集合。
1.1.遍历转换为大写:
List<String> output = wordList.stream().
     map(String::toUpperCase).
           collect(Collectors.toList());
- 1
 - 2
 - 3
 
1.2.平方数:
List<Integer> nums = Arrays.asList(1, 2, 3, 4);
   List<Integer> squareNums = nums.stream().
         map(n -> n * n).
       collect(Collectors.toList());
- 1
 - 2
 - 3
 - 4
 
2.过滤操作(filter):
使用filter可以对象Stream中进行过滤,通过测试的元素将会留下来生成一个新的Stream。
2.1.得到其中不为空的String
List<String> filterLists = new ArrayList<>();
filterLists.add("");
filterLists.add("a");
filterLists.add("b");
List afterFilterLists = filterLists.stream()
       .filter(s -> !s.isEmpty())
        .collect(Collectors.toList());
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 
3.循环操作(forEach):
如果只是想对流中的每个对象进行一些自定义的操作,可以使用forEach:
List<String> forEachLists = new ArrayList<>();
forEachLists.add("a");
forEachLists.add("b");
forEachLists.add("c");
forEachLists.stream().forEach(s-> System.out.println(s));
- 1
 - 2
 - 3
 - 4
 - 5
 
4.返回特定的结果集合(limit/skip):
limit 返回 Stream 的前面 n 个元素;skip 则是扔掉前 n 个元素:
List<String> forEachLists = new ArrayList<>();
forEachLists.add("a");
forEachLists.add("b");
forEachLists.add("c");
forEachLists.add("d");
forEachLists.add("e");
forEachLists.add("f");
List<String> limitLists = forEachLists.stream().skip(2).limit(3).collect(Collectors.toList());
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 
注意skip与limit是有顺序关系的,比如使用skip(2)会跳过集合的前两个,返回的为c、d、e、f,然后调用limit(3)会返回前3个,所以最后返回的c,d,e
5.排序(sort/min/max/distinct):
sort可以对集合中的所有元素进行排序。max,min可以寻找出流中最大或者最小的元素,而distinct可以寻找出不重复的元素:
5.1.对一个集合进行排序:
List<Integer> sortLists = new ArrayList<>();
sortLists.add(1);
sortLists.add(4);
sortLists.add(6);
sortLists.add(3);
sortLists.add(2);
List<Integer> afterSortLists = sortLists.stream().sorted((In1,In2)->
       In1-In2).collect(Collectors.toList());
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 
5.2、得到其中长度最大的元素:
List<String> maxLists = new ArrayList<>();
maxLists.add("a");
maxLists.add("b");
maxLists.add("c");
maxLists.add("d");
maxLists.add("e");
maxLists.add("f");
maxLists.add("hahaha");
int maxLength = maxLists.stream().mapToInt(s->s.length()).max().getAsInt();
System.out.println("字符串长度最长的长度为"+maxLength);
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 
5.3、对一个集合进行查重:
List<String> distinctList = new ArrayList<>();
distinctList.add("a");
distinctList.add("a");
distinctList.add("c");
distinctList.add("d");
List<String> afterDistinctList = distinctList.stream().distinct().collect(Collectors.toList());
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 
其中的distinct()方法能找出stream中元素equal(),即相同的元素,并将相同的去除,上述返回即为a,c,d。
6、匹配(Match方法):
有的时候,我们只需要判断集合中是否全部满足条件,或者判断集合中是否有满足条件的元素,这时候就可以使用match方法: 
allMatch:Stream 中全部元素符合传入的 predicate,返回 true 
anyMatch:Stream 中只要有一个元素符合传入的 predicate,返回 true 
noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true
6.1、判断集合中没有有为‘c’的元素:
List<String> matchList = new ArrayList<>();
matchList.add("a");
matchList.add("a");
matchList.add("c");
matchList.add("d");
boolean isExits = matchList.stream().anyMatch(s -> s.equals("c"));
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 
6.2、判断集合中是否全不为空:
List<String> matchList = new ArrayList<>();
matchList.add("a");
matchList.add("");
matchList.add("a");
matchList.add("c");
matchList.add("d");
boolean isNotEmpty = matchList.stream().noneMatch(s -> s.isEmpty());
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 
则返回的为false
				<script>
					(function(){
						function setArticleH(btnReadmore,posi){
							var winH = $(window).height();
							var articleBox = $("div.article_content");
							var artH = articleBox.height();
							if(artH > winH*posi){
								articleBox.css({
									'height':winH*posi+'px',
									'overflow':'hidden'
								})
								btnReadmore.click(function(){
									articleBox.removeAttr("style");
									$(this).parent().remove();
								})
							}else{
								btnReadmore.parent().remove();
							}
						}
						var btnReadmore = $("#btn-readmore");
						if(btnReadmore.length>0){
							if(currentUserName){
								setArticleH(btnReadmore,3);
							}else{
								setArticleH(btnReadmore,1.2);
							}
						}
					})()
				</script>
				</article>
Stream:java1.8新特性的更多相关文章
- java1.8新特性之stream流式算法
		
在Java1.8之前还没有stream流式算法的时候,我们要是在一个放有多个User对象的list集合中,将每个User对象的主键ID取出,组合成一个新的集合,首先想到的肯定是遍历,如下: List& ...
 - Java1.8新特性 - Stream流式算法
		
一. 流式处理简介 在我接触到java8流式数据处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现.比如我们希望对一个包 ...
 - java1.8新特性之stream
		
什么是Stream? Stream字面意思是流,在java中是指一个来自数据源的元素队列并支持聚合操作,存在于java.util包中,又或者说是能应用在一组元素上一次执行的操作序列.(stream是一 ...
 - java1.8新特性(一)
		
一直在更新java 版本,原来也没有关注java版本的变化 引入的一些新的api 引起注意的还是 关于一些并发包的使用,那时候才对每个版本的特性 去了解了一下,虽然 不一定都用上了,但是不管学习什 ...
 - java1.8新特性整理(全)
		
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/yitian_66/article/deta ...
 - java1.7新特性:try-with-resources
		
转载:https://blog.csdn.net/fanxiaobin577328725/article/details/53067163 首先看代码: import org.junit.Test; ...
 - Java1.7新特性
		
1.switch语句支持字符串变量 public String getTypeOfDayWithSwitchStatement(String dayOfWeekArg) { String typeOf ...
 - Java1.8新特性——接口改动和Lambda表达式
		
Java1.8新特性——接口改动和Lambda表达式 摘要:本文主要学习了Java1.8的新特性中有关接口和Lambda表达式的部分. 部分内容来自以下博客: https://www.cnblogs. ...
 - java1.8新特性(四 创建 stream对象)
		
java1.8 提供了 stream对象 可以用作 对 集合 数组的 一系列操作,都是基于lambda 表达式 ,所以得先熟悉lambda 表达式 集合创建stream对象 // 1.集合创建stre ...
 
随机推荐
- Python入门2 —— 变量
			
一:问号三连 1.什么是变量? 变 指的是事物的状态是可以发生变化的 量 指的是记录事物的状态 2.为什么要有变量? 为了让计算机像人一样去记录事物的状态 3.怎么用变量? 先定义 后引用 二:变量的 ...
 - B. Game with string 思维问题转化
			
B. Game with string 思维问题转化 题意 有一个字符串 每次可以删去连续的两个同样的字符,两个人轮流删,问最后谁能赢 思路 初看有点蒙蔽,仔细看看样例就会发现其实就是一个括号匹配问题 ...
 - win10 解决.net framework 3.5 安装报错 0x80240438
			
打开注册表:cmd+r 输入regedit,确定:找到路径HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU ...
 - 搭建第一个scrapy项目的常见问题
			
错误1:在执行 scrapy crawl spider名命令的时候 出现了ImportError:DLL load failed: %1不是有效的win32程序错误 这是因为pywin32的版本安装错 ...
 - 移动端 输入框 input 被弹出来的键盘 挡住
			
给被挡住的input或者textarea加一个id,然后在click事件里调用下面的代码 document.querySelector('#xxx').scrollIntoView();
 - varchar(n)
			
MySQL5.0.3之前varchar(n)这里的n表示字节数MySQL5.0.3之后varchar(n)这里的n表示字符数,比如varchar(200),不管是英文还是中文都可以存放200个根据字符 ...
 - [Excel] 一些实用的函数式子
			
这次是用php写了一个系统 收集信息,需要身份证号作为验证,但是为了信息安全 只能在数据库里面放身份证后六位.也就是说.最终导出的Excel也是只有身份证的后六位.,, 后来我发现我本地保存的完整身份 ...
 - Linux实现树莓派3B的国密SM9算法交叉编译——(一)环境部署、简单测试与eclipse工程项目测试
			
这篇文章主要介绍了交叉编译的实现,包括环境部署,并简单测试交叉编译环境是否安装成功. 一.交叉编译 在一个平台上生成另一个平台上的可执行代码.为什么要大费周折的进行交叉编译呢?一句话:不得已而为之.有 ...
 - Servlet获取配置信息(ServletConfig)
			
ServletConfig ServletConfig:当Servlet容器初始化Servlet时,Servlet容器会给Servlet的init方法传入一个ServletConfig.Servlet ...
 - Spring - Spring 常用注解
			
概述 简单整理一些 Spring 的注解 这个算是一个 水一波 类型的整理 内容不全 分类可能有的地方不会太符合逻辑 而且时间也不太充裕 先把自己想写的写下来, 然后随缘整理吧 约定 版本 Sprin ...