jdk8出来日子不短了,jdk11都出来了,不过用的最多的不过是1.5罢了。

今年终于鼓起勇气认真对待它,在18年记录下学习stream,画上一个圆。

先看个图

Java8中有两大最为重要的改变。第一个是Lambda 表达式;另外一个则是Stream API(java.util.stream.*)。

说说stream吧。前提得有lambda的基础。

Stream 是Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用SQL 执行的数据库查询。也可以使用Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

对stream的操作分为三类。

  1. 创建stream
  2. 中间操作(intermediate operations)
  3. 结束操作(terminal operations):

流程如下图

创建stream

虽然大部分情况下stream是容器调用Collection.stream()方法得到的,但stream和collections有以下不同:

  • 无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。
  • 为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。
  • 惰式执行。stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。
  • 可消费性。stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。
Stream API是Java 8中加入的一套新的API,主要用于处理集合操作,不过它的处理方式与传统的方式不同,
称为“数据流处理”。流(Stream)类似于关系数据库的查询操作,是一种声明式操作。比如要从数据库中获取所有id大于1(filter)的用户的名称(map)
并按照用户的score进行排序(sorted),如果在sql中就会很容易完成,但是在java程序中,在jdk8以前可能要使用很多的if条件,但是在jdk8的stream
流中,我们可以这样
@Test
public void test5() {
List<String> collect = list.stream()
.filter(p -> p.getId() > 1)
.sorted(Comparator.comparing(Star::getScore))
.map(Star::getName)
.collect((Collectors.toList()));
System.out.println(collect);
}

就是这么的容易。

 
 
 
 
jdk双冒号
还是比较绕的,看代码就明白了。详细借鉴
package com.test;

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer; import org.junit.Test; public class DoubleColonTest { public static void myPrint(String str) {
System.out.println("print value : " + str);
} /**
* 不使用双冒号
*/
@Test
public void test1() {
List<String> list = Arrays.asList("刘德华","黎明","张学友","郭富城");
list.forEach(p -> myPrint(p));
} /**
* 使用双冒号
*/
@Test
public void test2() {
List<String> list = Arrays.asList("刘德华","黎明","张学友","郭富城");
list.forEach(DoubleColonTest::myPrint);
} /**
* 类似于双冒号
*/
@Test
public void test3() {
List<String> list = Arrays.asList("刘德华","黎明","张学友","郭富城");
Consumer<String> methodParam = DoubleColonTest::myPrint;
list.forEach(methodParam);
} /**
* 类似于双冒号
*/
@Test
public void test4() {
List<String> list = Arrays.asList("刘德华","黎明","张学友","郭富城");
Consumer<String> methodParam = DoubleColonTest::myPrint;
list.forEach(p -> methodParam.accept(p));
} }

完整代码实例

package com.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream; import org.junit.Before;
import org.junit.Test; public class TestStream { List<Star> list = null; @Before
public void before() {
list = new ArrayList<Star>() {
{
add(new Star(1, "张学友", 11.3));
add(new Star(3, "刘德华", 4.3));
add(new Star(2, "黎明", 13.3));
add(new Star(5, "郭富城", 22.3));
add(new Star(4, "范冰冰", 2.3));
}
};
} /**
* 遍历方式
*/
@Test
public void test1() {
System.out.println("第一种---------");
for (Star Star : list) {
System.out.println(Star);
} System.out.println("第二种---------");
list.forEach(p -> System.out.println(p)); System.out.println("第三种---------");
list.forEach(System.out::println); System.out.println("第四种---------");
Iterator<Star> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
} System.out.println("第五种---------");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
} System.out.println("第六种---------");
for (Iterator<Star> it = list.iterator(); it.hasNext();) {
System.out.println(it.next());
} System.out.println("第七种---------");
for (int i = 0; i < list.size();) {
System.out.println(list.get(i));
i++;
} } /**
* 普通排序
*/
@Test
public void test2() {
Collections.sort(list, new Comparator<Star>() {
@Override
public int compare(Star o1, Star o2) {
return o1.getScore().compareTo(o2.getScore());
}
});
list.forEach(p -> System.out.println(p));
} /**
* lambda排序
*/
@Test
public void test3() {
Collections.sort(list, (p1, p2) -> p1.getScore().compareTo(p2.getScore()));
list.forEach(p -> System.out.println(p));
} /**
* streame排序
*/
@Test
public void test4() {
Stream<Star> stream = list.stream().sorted(Comparator.comparing(Star::getScore));// .forEach(p ->
stream.forEach(p -> System.out.println(p));
// list.forEach(p -> System.out.println(p));
} /**
* 进行过滤操作
*/
@Test
public void test5() {
List<String> collect = list.stream()
.filter(p -> p.getId() > 1)
.sorted(Comparator.comparing(p -> p.getScore()))
// .sorted(Comparator.comparing(Star::getScore))
.map(Star::getName)
.collect((Collectors.toList()));
System.out.println(collect);
} } class Star {
private Integer id;
private String name;
private Double score; public Double getScore() {
return score;
} public void setScore(Double score) {
this.score = score;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Star() {
super();
} public Star(Integer id, String name, Double score) {
super();
this.id = id;
this.name = name;
this.score = score;
} @Override
public String toString() {
return "Star [id=" + id + ", name=" + name + ", score=" + score + "]";
} }

OK,到位,入个门。。。

 
借鉴的地址
http://www.nowcode.cn/index.php/2017/02/27/326/
https://www.jianshu.com/p/ceb7bf515c03
 
 
 
 
 

试水jdk8 stream的更多相关文章

  1. POJ 2502 - Subway Dijkstra堆优化试水

    做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...

  2. 大众点评试水O2O新模式:实体店试穿,扫描二维码付款 现场取货

    在餐饮美食行业取得不错的成绩之后,大众点评将触角延伸到了线下的传统商铺,开始涉足线下商品的 O2O 团购.和传统的线上下单,线下消费的 O2O 模式不同.大众点评的 O2O 团购用户,可在店内试穿后通 ...

  3. Json.Net6.0入门学习试水篇

    原文:Json.Net6.0入门学习试水篇 前言 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.简单地说,JSON 可以将 JavaScript 对象中 ...

  4. 第一回:Scrapy的试水

    前言:今天算是见到Scrapy的第二天,之前只是偶尔查了查,对于这个框架的各种解释,我-----都-----看------不------懂----,没办法,见面就是刚. 目的:如题,试水 目标:< ...

  5. CSharpGL(49)试水OpenGL软实现

    CSharpGL(49)试水OpenGL软实现 CSharpGL迎来了第49篇.本篇内容是用C#编写一个OpenGL的软实现.暂且将其命名为SoftGL. 目前已经实现了由Vertex Shader和 ...

  6. UITableView(自定义cell)试水心得

    初次试水自定义cell的UITableView 实现目标      最终实现结果   界面复原度:98% 未能完全复刻的地方:下半部分的tableview与头部的控件间距上的误差 原因:在做table ...

  7. 大型网站技术架构(四)--核心架构要素 开启mac上印象笔记的代码块 大型网站技术架构(三)--架构模式 JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key异常解决(key重复)

    大型网站技术架构(四)--核心架构要素   作者:13GitHub:https://github.com/ZHENFENG13版权声明:本文为原创文章,未经允许不得转载.此篇已收录至<大型网站技 ...

  8. 微博试水卖车社交电商怎样令4S“颤抖”?

        微博对社交电商的探索一直在深入,年初.微博上线了"支付"产品.从而使社交产业链实现了闭环,随后,微博又尝试售卖多种商品,不断扩大移动电商的试水范围,近期微博大规模汽车销售收 ...

  9. JDK8 Stream 数据流效率分析

    JDK8 Stream 数据流效率分析 Stream 是Java SE 8类库中新增的关键抽象,它被定义于 java.util.stream (这个包里有若干流类型: Stream<T> ...

随机推荐

  1. shell学习1---基本的shell命令

    基本脚本 反引号: ``  反引号里面的内容是命令行,通过反引号用户可以将shell命令的输出赋给变量,比如: test=`date +%y%m%d` echo "The time is : ...

  2. 全解析jQuery插件开发!很好很强大!

    最近对JQuery插件开发超级感兴趣,看到这样一篇好文章,可以说是<用实例一步步教你写Jquery插件>的十全大补,大家可以两篇结合着看看! jQuery插件的开发包括两种: 一种是类级别 ...

  3. LintCode 158: Anagram

    LintCode 158: Anagram 题目描述 写出一个函数anagram(s, t)判断两个字符串是否可以通过改变字母的顺序变成一样的字符串. 样例 给出s = "abcd" ...

  4. Linux 下子进程与父进程的关系

    我们知道,Linux下父进程可以使用fork 函数创建子进程,但是当父进程先退出后,子进程会不会也退出呢? 通过下面这个小实验,我们能够很好的看出来: /******** basic.c ****** ...

  5. log4net记录系统错误日志到文本文件用法详解(最新)

    此配置文件可以直接拿来用,配置文件上面有详细用法说明,里面也有详细注释说明.此配置文件涵盖按照日期记录和按照文件大小(建议)的实例. 又包括:按照Fatal.Info.Error.Debug.Warn ...

  6. Node程序debug小记

    有时候,所见并不是所得,有些包,你需要去翻他的源码才知道为什么会这样. 背景 今天调试一个程序,用到了一个很久之前的NPM包,名为formstream,用来将form表单数据转换为流的形式进行接口调用 ...

  7. Openflow Plugin学习笔记3

    MDController.java 中的start方法,创建了SwitchConnectionHandlerImpl实例 SwitchConnectionHandlerImpl switchConne ...

  8. 状压dp(B - 炮兵阵地 POJ - 1185 )

    题目链接:https://cn.vjudge.net/contest/276236#problem/B 题目大意:略  具体思路:和我的上一篇写状压dp的思路差不多,不过就是这个题相当于上一个题的升级 ...

  9. 连接数据库及出现System.AccessViolationException错误的解决方法

    调试后发现, connection.Open();以后报错,System.AccessViolationException: 尝试读取或写入受保护的内存.这通常指示其他内存已损坏,网上搜了很多都没有作 ...

  10. openjudge-NOI 2.5基本算法之搜索 专题题解目录

    1.1700 八皇后问题 2.1756 八皇后 3.1789 算24