java8中Stream的使用示例教程

前言

Java8中提供了Stream对集合操作作出了极大的简化,学习了Stream之后,我们以后不用使用for循环就能对集合作出很好的操作。

本文将给大家详细介绍关于java8 Stream使用的相关内容,下面话不多说了,来一起看看详细的介绍吧

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

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);
 }

输出

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 详解

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • java8使用Stream API方法总结

    Stream是java8中处理集合的关键抽象概念,它可以指定您希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询. Stream 的三个操作步骤 1.创建Stream. 得到Stream流的第一种方式: 可以通过Collection系列集合提供提供的Stream()或parallelStream @Test public void test1() { //可以通过Collection系列集合提供提供的

  • Java8处理集合的优雅姿势之Stream

    前言 在Java中,集合和数组是我们经常会用到的数据结构,需要经常对他们做增.删.改.查.聚合.统计.过滤等操作.相比之下,关系型数据库中也同样有这些操作,但是在Java 8之前,集合和数组的处理并不是很便捷. 不过,这一问题在Java 8中得到了改善,Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据.本文就来介绍下如何使用Stream.特别说明一下,关于Stream的性能及原理不是本文的重点,如果大家感兴趣后面会出文章单独介绍. 1.Stream介绍

  • 详解Java8 Collect收集Stream的方法

    Collection, Collections, collect, Collector, Collectos Collection是Java集合的祖先接口. Collections是java.util包下的一个工具类,内涵各种处理集合的静态方法. java.util.stream.Stream#collect(java.util.stream.Collector<? super T,A,R>)是Stream的一个函数,负责收集流. java.util.stream.Collector 是一个收

  • Java8如何构建一个Stream示例详解

    Stream初体验 Stream是Java8中操作集合的一个重要特性,我们先来看看Java里面是怎么定义Stream的: "A sequence of elements supporting sequential and parallel aggregate operations." 我们来解读一下上面的那句话: 1.Stream是元素的集合,这点让Stream看起来用些类似Iterator: 2.可以支持顺序和并行的对原Stream进行汇聚的操作. Stream的创建方式有很多种,除

  • Java8中利用stream对map集合进行过滤的方法

    前言 Stream 是用函数式编程方式在集合类上进行复杂操作的工具,其集成了Java 8中的众多新特性之一的聚合操作,开发者可以更容易地使用Lambda表达式,并且更方便地实现对集合的查找.遍历.过滤以及常见计算等. 最近公司在大张旗鼓的进行代码审核,从中也发现自己写代码的不好习惯.一次无意的点到了公司封装的对map集合过滤的方法,发现了stream.于是研究了一下.并对原有的代码再次结合Optional进行重构下 原有方法说明 主要处理过滤条件Map对象,过滤掉了null和空字符串 等操作 这

  • 关于Java8 parallelStream并发安全的深入讲解

    背景 Java8的stream接口极大地减少了for循环写法的复杂性,stream提供了map/reduce/collect等一系列聚合接口,还支持并发操作:parallelStream. 在爬虫开发过程中,经常会遇到遍历一个很大的集合做重复的操作,这时候如果使用串行执行会相当耗时,因此一般会采用多线程来提速.Java8的paralleStream用fork/join框架提供了并发执行能力.但是如果使用不当,很容易陷入误区. Java8的paralleStream是线程安全的吗 一个简单的例子,

  • java8中parallelStream性能测试及结果分析

    测试1 @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) @Warmup(iterations = 5, time = 3, timeUnit = TimeUnit.SECONDS) @Measurement(iterations = 20, time = 3, timeUnit = TimeUnit.SECONDS) @Fork(1) @State(Scope.Benchmark) public cla

  • java8中Stream的使用示例教程

    前言 Java8中提供了Stream对集合操作作出了极大的简化,学习了Stream之后,我们以后不用使用for循环就能对集合作出很好的操作. 本文将给大家详细介绍关于java8 Stream使用的相关内容,下面话不多说了,来一起看看详细的介绍吧 1. 原理 Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator. 原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作: 高级版本的 Stream,用户只要给出需

  • Java8中的lambda表达式入门教程

    1.基本介绍 lambda表达式,即带有参数的表达式,为了更清晰地理解lambda表达式,先上代码: 1.1 两种方式的对比 1.1.1 方式1-匿名内部类 class Student{ private String name; private Double score; public Student(String name, Double score) { this.name = name; this.score = score; } public String getName() { ret

  • java8中Stream的使用以及分割list案例

    一.Steam的优势 java8中Stream配合Lambda表达式极大提高了编程效率,代码简洁易懂(可能刚接触的人会觉得晦涩难懂),不需要写传统的多线程代码就能写出高性能的并发程序 二.项目中遇到的问题 由于微信接口限制,每次导入code只能100个,所以需要分割list.但是由于code数量可能很大,这样执行效率就会很低. 1.首先想到是用多线程写传统并行程序,但是博主不是很熟练,写出代码可能会出现不可预料的结果,容易出错也难以维护. 2.然后就想到Steam中的parallel,能提高性能

  • Java8中Stream的一些神操作

    Java8对集合提供了一种流式计算的方式,这种风格将要处理的元素集合看 作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如 筛选, 排序,聚合等. Stream API 基本都是返回Stream本身,这样多个操作可以串联成一个管 道, 如同流式风格(fluent style). 这样做可以对操作进行优化, 比 如延迟执行(laziness)和短路( short-circuiting) stream() 为集合创建串行流 parallelStream() 为集合创建并行流 pri

  • Java8中Stream流式操作指南之入门篇

    目录 简介 正文 1. 流是什么 2. 老板,上栗子 3. 流的操作步骤 4. 流的特点 5. 流式操作和集合操作的区别: 总结 简介 流式操作也叫做函数式操作,是Java8新出的功能 流式操作主要用来处理数据(比如集合),就像泛型也大多用在集合中一样(看来集合这个小东西还是很关键的啊,哪哪都有它) 下面我们主要用例子来介绍下,流的基操(建议先看下lambda表达式篇,里面介绍的lambda表达式.函数式接口.方法引用等,下面会用到) 正文 1. 流是什么 流是一种以声明性的方式来处理数据的AP

  • Java8中Stream的使用方式

    目录 前言: 1. 为什么有经验的老手更倾向于使用Stream 2. Stream 的使用方式 3. Stream 的创建 4. Stream 中间操作 5. Stream 终止操作 6. Stream 特性 前言: 相信有很多刚刚入坑程序员的小伙伴被一些代码搞的很头疼,这些代码让我们既感觉到很熟悉,又很陌生的感觉.我们很多刚入行的朋友更习惯于使用for循环或是迭代器去解决一些遍历的问题,但公司里很多老油子喜欢使用Java8新特性Stream流去做,这样可以用更短的代码实现需求,但是对于不熟悉的

  • Java8中Stream的详细使用方法大全

    目录 一.概述 1.使用流的好处 2.流是什么? 二.分类 三.Stream的创建 1.通过 java.util.Collection.stream() 方法用集合创建流 2.使用 java.util.Arrays.stream(T[]array)方法用数组创建流 3.使用 Stream的静态方法:of().iterate().generate() 四.Stream API简介 1.遍历/匹配(foreach/find/match) 2.按条件匹配filter 3.聚合max.min.count

  • Java8中stream和functional interface的配合使用详解

    前言 Java 8 提供了一组称为 stream 的 API,用于处理可遍历的流式数据.stream API 的设计,充分融合了函数式编程的理念,极大简化了代码量. 大家其实可以把Stream当成一个高级版本的Iterator.原始版本的Iterator,用户只能一个一个的遍历元素并对其执行某些操作:高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如"过滤掉长度大于10的字符串"."获取每个字符串的首字母"等,具体这些操作如何应用到每个元素上,

  • Java8中Stream使用的一个注意事项

    Stream简介 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel aggregate operations. 我们来解读一下上面的那句话: Stream是元素的集合,这点让Stream看起来用些类似Iterator: 可以支持顺序和并行的对原Stream进行汇聚的操作: 大家可以把Stream当成一个高级版本的Iterator.原始版本的Iterator,用户只能一个一个的遍历

  • java8新特性之stream的collect实战教程

    1.list转换成list 不带return方式 List<Long> ids=wrongTmpList.stream().map(c->c.getId()).collect(Collectors.toList()); 带return方式 // spu集合转化成spubo集合//java8的新特性 List<SpuBo> spuBos=spuList.stream().map(spu -> { SpuBo spuBo = new SpuBo(); BeanUtils.c

随机推荐