经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
java8中Stream的使用示例教程
来源:jb51  时间:2018/11/1 9:44:10  对本文有异议

前言

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

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

1. 原理

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

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

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

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

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

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

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

2.使用步骤

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

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

3. Stream的构造

  1. public void test4() {
  2. Stream stream = Stream.of("a", "b", "c", 23);
  3. stream.forEach(key -> System.out.println(key));
  4.  
  5. String[] array = new String[]{"abc", "efg"};
  6. stream = Stream.of(array);
  7. stream = Arrays.stream(array);
  8. stream.forEach(key -> System.out.println(key));
  9.  
  10. List<String> list = Arrays.asList(array);
  11. stream = list.stream();
  12.  
  13. //IntStream、LongStream、DoubleStream
  14. IntStream stream2 = IntStream.of(1, 2, 3, 3);
  15. DoubleStream stream4 = DoubleStream.of(1, 2, 3, 3.4);
  16.  
  17. stream2.forEach(key -> System.out.println(key));
  18. stream4.forEach(key -> System.out.println(key));
  19. }

结果

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

4. Stream的转换

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

结果

2

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

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

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

输出

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.转换大写

  1. public void test7() {
  2. List<String> list = Arrays.asList("a", "MnM");
  3.  
  4. List<String> result = list.stream().
  5. map(String::toUpperCase).
  6. collect(Collectors.toList());
  7. System.out.println(list);
  8. System.out.println(result);
  9. }

输出

[a, MnM]
[A, MNM]

7.平方

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

输出

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

8.找偶数

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

输出

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

9. 区间值

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

结果

1
2
 
 
1
2
3

10.并发

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

输出

3
7
1
5
2
8
10
6
9
4  

是否并发思考

11. 新的Stream继续操作

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

结果

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

12. Optional

  1. public static void print(String text) {
  2. System.out.println("<<<<<<");
  3. System.out.println(Optional.ofNullable(text));
  4. List<String> obj = new ArrayList<>();
  5. Optional.ofNullable(text).ifPresent(System.out::println);
  6. System.out.println(">>>>>>>>>>>>\n");
  7. }
  8. public static int getLength(String text) {
  9. return Optional.ofNullable(text).map(String::length).orElse(-1);
  10. }
  11.  
  12. public void test14() {
  13. String strA = " abcd ", strB = null;
  14. print(strA);
  15. print("");
  16. print(strB);
  17.  
  18. System.out.println(getLength(strA));
  19. System.out.println(getLength(""));
  20. System.out.println(getLength(strB));
  21. }

结果

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

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

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

结果

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

14. limit, skip

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

输出

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

15.找出最长一行的长度

  1. public void test19() throws IOException {
  2. String path = "**/Person.java";
  3. BufferedReader br = new BufferedReader(new FileReader(path));
  4. int longest = br.lines()
  5. .mapToInt(String::length)
  6. .max()
  7. .getAsInt();
  8. br.close();
  9. System.out.println(longest);
  10. }

输出

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

  1. public void test20() throws IOException {
  2. String path = "**/Person.java";
  3. BufferedReader br = new BufferedReader(new FileReader(path));
  4. List<String> words = br.lines()
  5. .flatMap(line->Stream.of(line.split(" ")))
  6. .filter(word->word.length()>0)
  7. .map(String::toLowerCase)
  8. .distinct()
  9. .sorted()
  10. .collect(Collectors.toList());
  11. br.close();
  12. System.out.println(words);
  13. words.forEach(key-> System.out.println(key));
  14. }

输出

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

参考

Java 8 中的 Streams API 详解

总结

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号