Java - Stream流

Stream流

  1. 获取Stream流对象,将数据放到流中

    1. 集合获取Stream流对象(使用Collection接口中的默认方法)

      • default Stream stream()
      • Map集合获取Stream流对象,需要间接获取,可以通过.values()和.keySet()去实现Map的流操作,但是将键值拆分是不推荐的。以后要使用entrySet()先将Map改为Set集合然后再用流对象
      • map.entrySet().stream()
          private static void method1() {
              // 单列集合
              List<String> list = new ArrayList<>();
              list.add("one");
              list.add("two");
              list.add("three");
              list.add("four");
              list.add("five");
              list.add("five");
              list.add("six");
              list.stream().forEach(s -> System.out.println(s));
              System.out.println("list print finished");
      
              Set<String> set = list.stream().collect(Collectors.toSet());
              set.stream().forEach(s -> System.out.println(s));
              System.out.println("set print finished");
      
              // 双列集合
              Map<String, Integer> map = new HashMap<>();
              map.put("one", 1);
              map.put("two", 2);
              map.put("three", 3);
              map.put("four", 4);
              map.put("five", 5);
              map.entrySet().stream().forEach(stringIntegerEntry -> System.out.println(stringIntegerEntry));
              System.out.println("map print finished");
          }
      
    2. 数组获取Stream流对象(使用Arrays数据工具类中的静态方法)

      • static <T> Stream<T> stream (T[] array)
          private static void method2() {
              int[] ints = {11, 22, 33};
              double[] doubles = {11.1, 22.1, 33.1};
      
              IntStream intStream = Arrays.stream(ints);
              intStream.forEach(s -> System.out.println(s));
      
              DoubleStream doubleStream = Arrays.stream(doubles);
              doubleStream.forEach(s -> System.out.println(s));
      
              Stream stream = Stream.of(1, 2, 3, 4, 5);
              stream.forEach(s -> System.out.println(s));
          }
      
    3. 零散的数据获取Stream流对象(使用Stream类中的静态方法)

      • static <T> Stream<T> of(T… values)
          private static void method2() {
              Stream stream = Stream.of(1, 2, 3, 4, 5);
              stream.forEach(s -> System.out.println(s));
          }
      
  2. 中间方法(Stream流被终止过后就不能再调用使用了,只能重新创建),返回对象

    • Stream流的中间操作方法:操作后返回Stream对象,可以继续操作
    • Stream<T> filter(Predicate<? super T> predicate)用于对流中的数据进行过滤
    • Stream<T> limit(long maxSize) 获取前几个元素
    • Stream<T> skip(long n) 跳过前几个元素
    • Stream<T> distinct() 去除流中重复的元素,依赖hashCode和equals方法
    • Static<T> Stream<T> concat(Stream a, Stream b) 合并a和b两个流为一个流
  3. 终结方法

    • void forEach(Consumer action) - 对此流的每个元素执行遍历操作
    • long count() - 返回此流中的元素数量
public static void main(String[] args) {
        Stream.of(1, 2, 3, 4, 5, 6).filter(s -> s % 2 == 0).forEach(s -> System.out.println(s));
        long count = Stream.of(1, 2, 3, 4, 5, 6).filter(s -> s % 2 == 0).count();
        System.out.println(count);
    }
  1. Stream 收集操作
  • 把 Stream 流操作后的结果数据转回到集合
    • R collect(Collector collector) - 开始收集 Stream 流,指定收集器
  • Collectors 工具类提供了具体的收集方式
    • public static Collector toList() - 把元素收集到List集合中
    • public static Collector toSet() - 把元素收集到Set集合中
    • public static Collector toMap() - 把元素收集到Map集合中

File类

### Java Stream API 使用教程 #### 一、Stream API简介 Java 8引入的Stream API是一项革新性功能,旨在为集合数据处理提供一种声明式的编程方式。这不仅让代码更为简洁优雅,而且提升了性能表现[^1]。 #### 二、创建Stream实例的方法 可以通过多种途径获取Stream对象: - **从Collection集合转换** ```java List<String> list = Arrays.asList("apple", "banana", "orange"); Stream<String> streamFromList = list.stream(); ``` - **数组转Stream** ```java String[] fruitsArray = {"apple", "banana", "orange"}; Stream<String> streamFromArray = Arrays.stream(fruitsArray); ``` - **通过Stream静态方法构建** ```java Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5); ``` #### 三、中间操作与终端操作 Stream支持一系列丰富的中间操作用于过滤、映射等预处理工作;而终端操作则负责触发整个水线执行并返回最终结果。 ##### 中间操作示例 - 过滤特定条件的数据项 ```java streamFromList.filter(s -> s.startsWith("a")); ``` 此段代码会筛选出所有以字母'a'开头字符串组成的新的[^2]。 - 映射元素至其他形式 ```java streamFromList.map(String::toUpperCase); ``` 上述语句能够把原列表里的每一个单词都变成大写版本的新[^3]。 ##### 终端操作举例 - 收集结果到新容器内 ```java List<String> result = streamFromList.collect(Collectors.toList()); ``` 这段程序将会把经过前面各种变换后的元素收集起来存放到一个新的`List`当中去。 - 计算总数目 ```java long count = streamFromList.count(); ``` 该命令用来统计当前中有多少个条目存在。 #### 四、常见组合模式展示 下面给出一段综合运用了多个特性的例子来说明如何灵活应用这些概念完成实际任务: 假设有一个整数序列想要找出其中所有的偶数并将它们平方之后再求和。 ```java int sumOfSquares = IntStream.rangeClosed(1, 10) // 创建范围内的IntStream .filter(n -> n % 2 == 0) // 只保留偶数值 .map(n -> n * n) // 将其各自乘方得到平方值 .sum(); // 所有项目相加得出总和 System.out.println(sumOfSquares); // 输出计算所得的结果 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值