1. 原理

Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。

原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;

高级版本的 Stream,用户只要给出需要对其包含的元素执行什么操作,比如:

  • 所有元素求和
  • 过滤掉长度大于 10 的字符串
  • 获取每个字符串的首字母

Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。

而和迭代器又不同的是,Stream 可以并行化操作

Stream 的另外一大特点是,数据源本身可以是无限的

2.使用步骤

获取一个数据源(source)→ 数据转换→执行操作获取想要的结果

每次转换原有 Stream 对象不改变,返回一个新的 Stream对象(可以有多次转换),这就允许对其操作可以像链条一样排列,变成一个管道,如下图所示。

3. Stream的构造

 public void test4() {
Stream stream = Stream.of("a", "b", "c", 23);
stream.forEach(key -> System.out.println(key)); String[] array = new String[]{"abc", "efg"};
stream = Stream.of(array);
stream = Arrays.stream(array);
stream.forEach(key -> System.out.println(key)); List<String> list = Arrays.asList(array);
stream = list.stream(); //IntStream、LongStream、DoubleStream
IntStream stream2 = IntStream.of(1, 2, 3, 3);
DoubleStream stream4 = DoubleStream.of(1, 2, 3, 3.4); stream2.forEach(key -> System.out.println(key));
stream4.forEach(key -> System.out.println(key));
}

结果

a
b
c
23
abc
efg
1
2
3
3
1.0
2.0
3.0
3.4

4. Stream的转换

public void test6() {
Stream stream = Stream.of("abc", "def"); String[] array = (String[])stream.toArray(String[]::new);
System.out.println(array.length);
List<String> list = (List<String>)Stream.of("1", "2", "3").collect(Collectors.toList());
String str = Stream.of("abc", "mn").collect(Collectors.joining()).toString();
System.out.println(array);
System.out.println(list);
System.out.println(str);
}

结果

2
[Ljava.lang.String;@17f052a3
[1, 2, 3]
abcmn

5.一个 Stream 只可以使用一次

public void test6_5() {
Stream stream = Stream.of(1, 2, 3, 2);
System.out.println("count:" + stream.count());
System.out.println("count:" + stream.count());
}

输出

Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
at java.util.stream.AbstractPipeline.<init>(AbstractPipeline.java:203)
at java.util.stream.LongPipeline.<init>(LongPipeline.java:91)
at java.util.stream.LongPipeline$StatelessOp.<init>(LongPipeline.java:572)
at java.util.stream.ReferencePipeline$5.<init>(ReferencePipeline.java:221)
at java.util.stream.ReferencePipeline.mapToLong(ReferencePipeline.java:220)
at java.util.stream.ReferencePipeline.count(ReferencePipeline.java:526)
at streamTest.StreamTest.test6_5(StreamTest.java:68)
at streamTest.StreamTest.main(StreamTest.java:181)
count:4

6.转换大写

public void test7() {
List<String> list = Arrays.asList("a", "MnM"); List<String> result = list.stream().
map(String::toUpperCase).
collect(Collectors.toList());
System.out.println(list);
System.out.println(result);
}

输出

[a, MnM]
[A, MNM]

7.平方

public void test8() {
List<Integer> list2 = Arrays.asList(1, 2, 4);
List<Integer> list3 = list2.stream().
map(key -> key * key).
collect(Collectors.toList());
System.out.println(list2);
System.out.println(list3); }

输出

[1, 2, 4]
[1, 4, 16]

8.找偶数

public void test8_5() {
List<Integer> list2 = Arrays.asList(1, 2, 4);
List<Integer> list3 = list2.stream().
filter(key -> key % 2 == 0).
collect(Collectors.toList());
System.out.println(list2);
System.out.println(list3);
}

输出

[1, 2, 4]
[2, 4]

9. 区间值

 public void test5() {
System.out.println("\n");
IntStream.range(1, 3).forEach(System.out::println);
System.out.println("\n");
IntStream.rangeClosed(1, 3).forEach(System.out::println);
}

结果

1
2 1
2
3

10.并发

 public void test5_pa() {
IntStream.rangeClosed(1, 10).parallel().forEach(System.out::println);
}

输出

3
7
1
5
2
8
10
6
9
4  

是否并发思考

11. 新的Stream继续操作

public void test6_6() {
Stream.of("one", "two", "three", "four")
.filter(e -> e.length() > 3)
.peek(e -> System.out.println("Filtered value: " + e))
.map(String::toUpperCase)
.peek(e -> System.out.println("Mapped value: " + e))
.collect(Collectors.toList());
}

结果

Filtered value: three
Mapped value: THREE
Filtered value: four
Mapped value: FOUR

12. Optional

public static void print(String text) {
System.out.println("<<<<<<");
System.out.println(Optional.ofNullable(text));
List<String> obj = new ArrayList<>();
Optional.ofNullable(text).ifPresent(System.out::println);
System.out.println(">>>>>>>>>>>>\n");
}
public static int getLength(String text) {
return Optional.ofNullable(text).map(String::length).orElse(-1);
} public void test14() {
String strA = " abcd ", strB = null;
print(strA);
print("");
print(strB); System.out.println(getLength(strA));
System.out.println(getLength(""));
System.out.println(getLength(strB));
}

结果

<<<<<<
Optional[ abcd ]
abcd
>>>>>>>>>>>> <<<<<<
Optional[] >>>>>>>>>>>> <<<<<<
Optional.empty
>>>>>>>>>>>> 6
0
-1

13. 字符串拼接、最值、求和、过滤

public void test15() {
String concat = Stream.of("A", "B", "C").reduce("", String::concat);
System.out.println("concat:" + concat); double minValue = Stream.of(-1.5, 1.0, -3.0, -2.0).reduce(Double.MAX_VALUE, Double::min);
System.out.println("min:" + minValue); int sumValue = Stream.of(1, 2, 3, 4).reduce(0, Integer::sum);
System.out.println("sum1:" + sumValue); int sumValue2 = Stream.of(1, 2, 3, 4).reduce(Integer::sum).get();
System.out.println("sum2:" + sumValue2); concat = Stream.of("a", "B", "c", "D", "e", "F").filter(x -> x.compareTo("Z") > 0).reduce("", String::concat);
System.out.println("concat:" + concat);
}

结果

concat:ABC
min:-3.0
sum1:10
sum2:10
concat:ace

14. limit, skip

public void test16() {
List<Person> persons = new ArrayList<>();
IntStream.range(1, 1000).forEach(key->persons.add(new Person(key, "jihite:" + key)));
List<String> personList = persons.stream().map(Person::getName).limit(10).skip(3).collect(Collectors.toList());
System.out.println(personList);
}

输出

[jihite:4, jihite:5, jihite:6, jihite:7, jihite:8, jihite:9, jihite:10]

15.找出最长一行的长度

public void test19() throws IOException {
String path = "**/Person.java";
BufferedReader br = new BufferedReader(new FileReader(path));
int longest = br.lines()
.mapToInt(String::length)
.max()
.getAsInt();
br.close();
System.out.println(longest);
}

输出

40

16.找出全文的单词,转小写,并排序

public void test20() throws IOException {
String path = "**/Person.java";
BufferedReader br = new BufferedReader(new FileReader(path));
List<String> words = br.lines()
.flatMap(line->Stream.of(line.split(" ")))
.filter(word->word.length()>0)
.map(String::toLowerCase)
.distinct()
.sorted()
.collect(Collectors.toList());
br.close();
System.out.println(words);
words.forEach(key-> System.out.println(key));
}

输出

*
*/
/**
//
2018/10/24
21:40
=
@author:
@date:
@description:
class
getname()
int
name)

  

参考

Java 8 中的 Streams API 详解

java8 Stream使用案例的更多相关文章

  1. Java8 新特性学习 Lambda表达式 和 Stream 用法案例

    Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...

  2. java List递归排序,传统方式和java8 Stream优化递归,无序的列表按照父级关系进行排序(两种排序类型)

    当有一个List列表是无序的,List中的数据有parentid进行关联,通过java排序成两种排序类型: 所用的测试列表最顶级无parentid,若为特殊值,修改下判断方法即可. 第一种排序:按照树 ...

  3. java8 Stream的实现原理 (从零开始实现一个stream流)

    1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2  ...

  4. 简洁又快速地处理集合——Java8 Stream(下)

    上一篇文章我讲解 Stream 流的基本原理,以及它与集合的区别关系,讲了那么多抽象的,本篇文章我们开始实战,讲解流的各个方法以及各种操作 没有看过上篇文章的可以先点击进去学习一下 简洁又快速地处理集 ...

  5. 简洁又快速地处理集合——Java8 Stream(上)

    Java 8 发布至今也已经好几年过去,如今 Java 也已经向 11 迈去,但是 Java 8 作出的改变可以说是革命性的,影响足够深远,学习 Java 8 应该是 Java 开发者的必修课. 今天 ...

  6. Java8 Stream性能如何及评测工具推荐

    作为技术人员,学习新知识是基本功课.有些知识是不得不学,有些知识是学了之后如虎添翼,Java8的Stream就是兼具两者的知识.不学看不懂,学了写起代码来如虎添翼. 在上篇<Java8 Stre ...

  7. Java8 Stream新特性详解及实战

    Java8 Stream新特性详解及实战 背景介绍 在阅读Spring Boot源代码时,发现Java 8的新特性已经被广泛使用,如果再不学习Java8的新特性并灵活应用,你可能真的要out了.为此, ...

  8. 如何通过 IntelliJ IDEA 来提升 Java8 Stream 的编码效率

    本文翻译整理自:https://winterbe.com/posts/2015/03/05/fixing-java-8-stream-gotchas-with-intellij-idea 作者:@Wi ...

  9. 如何用Java8 Stream API找到心仪的女朋友

    传统的的Java 集合操作是有些啰嗦的,当我们需要对结合元素进行过滤,排序等操作的时候,通常需要写好几行代码以及定义临时变量. 而Java8 Stream API 可以极大简化这一操作,代码行数少,且 ...

随机推荐

  1. 1.java面向对象编程三大特性之封装

    封装即把一个对象的属性.行为等放在一个实体类中隐藏起来,不允许外部对其进行修改,但是被封装的属性.行为会对外提供一个接口与外部联系,这个对外的接口通常情况下就是set().get()方法.可以通过se ...

  2. hdu 5094 状压bfs+深坑

    http://acm.hdu.edu.cn/showproblem.php?pid=5094 给出n*m矩阵 给出k个障碍,两坐标之间存在墙或门,门最多10种,状压可搞 给出s个钥匙位置及编号,相应的 ...

  3. spring security文档地址

    https://docs.spring.io/spring-security/site/docs/4.1.0.RELEASE/reference/htmlsingle/

  4. delphi中OleContainer的使用总结

    1:定义流的header , OleContainer要求流中要有Headertype //流Header的结构 TStreamHeader = record Signature: Integer; ...

  5. cudnn 安装步骤

    上官网下载对应的cudnn https://developer.nvidia.com/cudnn 下载完cudnn后,命令行输入文件所在的文件夹 (ubuntu为本机用户名) cd home/ubun ...

  6. petapoco 新手上路

    PetaPoco是一个轻量级ORM框架 用法可参考http://www.toptensoftware.com/petapoco/  https://github.com/CollaboratingPl ...

  7. C++ OCCI API数据库操作之连接、返回查询结果集为json格式

    使用C++操作数据库,转换返回结果集为json格式,易于解析. 以下程序的编译.运行环境:Windows 10 1803.VS2017 17.5.2(vc14).解决方案配置:Release.解决方案 ...

  8. Modeless对话框如何响应快捷键

    MFC,Modeless对话框不会响应快捷键.解决的方案很多,其中之一是在PreTranslateMessage中地键盘消息进行拦截处理.

  9. 【BZOJ5290】 [Hnoi2018]道路

    BZOJ5290 [Hnoi2018]道路 前言 这道题目我竟然没有在去年省选切? 我太菜了. Solution 对题面进行一个语文透彻解析,发现这是一个二叉树,乡村都是叶子节点,城市都有两个儿子.( ...

  10. leetcode 152. 乘积最大子序列 java

    题目: 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6. ...