Stream API

stream介绍

  1. java类库的补充,写出更简洁高效的代码。
  2. 处理集合的关键抽象概念,操作集合像sql,高效处理数据的方式。

    什么是stream

  3. stream 关注的是对数据的运算,与cpu打交道。而集合;存储;内存

  4. 特点
    1. 自己不会存储元素
    2. 不可变性
    3. 操作的延迟的,调用了终止操作才会执行。
  5. Stream执行流程

    1. 实例化
    2. 中间操作
    3. 终止操作:一旦终止,产生结果之后就不能用了。

      Stream的中间操作


  6. 代码

  1. public class test {
  2. public static void main(String[] args) {
  3. /**
  4. * 创建流的举例
  5. */
  6. //1.通过集合
  7. List<String> l = new ArrayList<>();
  8. //顺序流
  9. Stream<String> stream = l.stream();
  10. //并行流
  11. Stream<String> stringStream = l.parallelStream();
  12. //2.通过数组
  13. Integer[] integers = {1, 2, 3, 4, 4};
  14. Stream<Integer> stream1 = Arrays.stream(integers);
  15. //3.通过Stream.of
  16. Stream<Integer> integers1 = Stream.of(integers);
  17. //4.无线流
  18. //迭代
  19. Stream.iterate(0, T -> T + 2).limit(10).forEach(System.out::println);
  20. //生成
  21. Stream.generate(Math::random).limit(10).forEach(System.out::println);
  22. /**
  23. * 中间操作
  24. */
  25. //1.筛选和切片
  26. //filter(Predicate p) 从流中过滤排除某些元素
  27. stream1.filter(t -> Integer.compare(t, 1) > 0).forEach(System.out::println);
  28. //limit(n) 截断流,使元素不超过给定数量
  29. Stream<Integer> stream2 = Arrays.stream(integers);
  30. stream2.filter(t -> Integer.compare(t, 1) > 0).limit(2).forEach(System.out::println);
  31. // skip(n) 跳过n个元素,不足n个,返回一个空流
  32. System.out.println("*********************");
  33. Stream<Integer> stream3 = Arrays.stream(integers);
  34. stream3.filter(t -> Integer.compare(t, 1) > 0).skip(4).forEach(System.out::println);
  35. //distinct 筛选,通过hashcode和equals 去除重复的。
  36. System.out.println("*********************");
  37. Stream<Integer> stream4 = Arrays.stream(integers);
  38. stream4.filter(t -> Integer.compare(t, 1) > 0).distinct().forEach(System.out::println);
  39. //2.映射
  40. //map(Function f)接收一种元素转换成另外一种形式
  41. System.out.println("*********************");
  42. List<String> list = Arrays.asList("aa", "bb");
  43. list.stream().map(s -> s.toUpperCase()).forEach(System.out::println);
  44. //flatmap(Function f)接收一种元素,当返回一个流时,打开中括号。
  45. list.stream().flatMap(test::getCharacterStream).forEach(System.out::println);
  46. //3.排序
  47. //sorted/sorted(comparator com)
  48. System.out.println("*********************");
  49. List<Integer> list1 = Arrays.asList(1, 31, 5, 123, 2, 3123);
  50. list1.stream().sorted().forEach(System.out::println);
  51. /**
  52. * 终止操作
  53. */
  54. //1.匹配与查找
  55. //allMatch所有元素都匹配
  56. System.out.println("*********************");
  57. boolean b = list1.stream().allMatch(i -> i > 1);
  58. System.out.println(b);
  59. //anyMatch任意元素匹配
  60. boolean b1 = list1.stream().anyMatch(i -> i > 2);
  61. System.out.println(b1);
  62. //noneMatch没有元素匹配
  63. boolean b2 = list1.stream().noneMatch(i -> i > 100000);
  64. System.out.println(b2);
  65. //findFirst()找第一个
  66. Optional<Integer> first = list1.stream().findFirst();
  67. //findAny找任意一个
  68. Optional<Integer> any = list1.stream().findAny();
  69. //max(comparator)最大
  70. list1.stream().max(Integer::compareTo);
  71. //min(comparator)最小
  72. list1.stream().min(Integer::compareTo);
  73. //count()总条数
  74. long count = list1.stream().count();
  75. //forEach(Consumer)内部迭代
  76. list1.stream().forEach(System.out::println);
  77. //2.归约
  78. //reduce(identity, BinaryOperator)求和,有初始值
  79. Integer reduce1 = list1.stream().reduce(10, Integer::sum);
  80. System.out.println(reduce1);
  81. //reduce(BinaryOperator)求和,没有初始值
  82. Optional<Integer> reduce = list1.stream().reduce((o1, o2) -> o1 + o2);
  83. System.out.println(reduce);
  84. }
  85. public static Stream<Character> getCharacterStream(String str) {
  86. List<Character> list = new ArrayList<>();
  87. for (Character c : str.toCharArray()) {
  88. list.add(c);
  89. }
  90. return list.stream();
  91. }
  92. }