Stream-流式處理的常用操作你GET到了嗎?

新特性

  1. 對集合(Collection)對象功能的增強,它專注於對集合對象進行各種非常便利、高效的聚合操作(aggregate operation),或者大批量數據操作 (bulk data operation)。

  2. 藉助於同樣新出現的Lambda表達式,極大的提高編程效率和程序可讀性。

  3. 提供串行和並行兩種模式進行匯聚操作,併發模式能夠充分利用多核處理器的優勢,使用fork/join並行方式來拆分任務和加速處理過程。通常編寫並行代碼很難而且容易出錯, 但使用Stream API無需編寫一行多線程的代碼,就可以很方便地寫出高性能的併發程序。

使用技巧

  1. 獲取集合中某屬性值的集合

    List<UserDto> userDtos = Arrays.asList(
          new UserDto(1, "用戶1"),
          new UserDto(2, "用戶2"),
          new UserDto(3, "用戶3")
    );
    List<Integer> userId = userDtos.stream().map(UserDto::getUserId).collect(Collectors.toList());
    System.out.println(userId);
  2. 將集合轉爲map對象,以集合中某屬性作爲key,該屬性值對應的對象做value;

    //以userId作爲key,key不能重複
    List<UserDto> userDtos = Arrays.asList(
          new UserDto(1, "用戶1"),
          new UserDto(2, "用戶2"),
          new UserDto(3, "用戶3")
    );
    //方式1
    Map<Integer, UserDto> userDtoMap = userDtos.stream()
          .collect(Collectors.toMap(UserDto::getUserId, Function.identity()));
    System.out.println(userDtoMap);
    ​
    //方式2
    Map<Integer, UserDto> userDtoMap2 = userDtos.stream()
          .collect(Collectors.toMap(UserDto::getUserId, UserDto->UserDto));
    System.out.println(userDtoMap2);
  3. 以集合中某屬性進行分組

    List<UserDto> userDtos = Arrays.asList(
          new UserDto(1, 20),
          new UserDto(2, 21),
          new UserDto(3, 20)
    );
    Map<Integer, List<UserDto>> userMap = userDtos.stream()
          .collect(Collectors.groupingBy(UserDto::getAge));
    System.out.println(userMap);
  4. 以集合中某屬性進行排序

    List<UserDto> userDtos = Arrays.asList(
          new UserDto(3, 22),
          new UserDto(2, 21),
          new UserDto(4, 21),
          new UserDto(1, 20)
    );
    List<UserDto> userDtoList = userDtos.stream()
        //.reversed()倒序,沒有是正序
          .sorted(Comparator.comparing(UserDto::getUserId).reversed())
          .collect(Collectors.toList());
    System.out.println(userDtoList);
  5. 以集合中某屬性進行排序後再以另一個屬性進行分組

    List<UserDto> userDtos = Arrays.asList(
          new UserDto(3, 22),
          new UserDto(2, 21),
          new UserDto(4, 21),
          new UserDto(1, 20)
    );
    TreeMap<Integer, List<UserDto>> userDtoMap = userDtos.stream()
        //先以UserId進行排序
          .sorted(Comparator.comparing(UserDto::getUserId進行排序))
        //再以年齡進行分組
          .collect(Collectors.groupingBy(UserDto::getAge, TreeMap::new, Collectors.toList()));
    System.out.println("正序: " + userDtoMap);
    //以分組的key值倒序
    System.out.println("倒序" + userDtoMap.descendingMap());
  6. 對集合中某數值屬性進行求和、平均值、計數等

    List<UserDto> userDtos = Arrays.asList(
          new UserDto(1, 20),
          new UserDto(2, 23),
          new UserDto(3, 21)
    );
    Integer age = userDtos.stream().mapToInt(UserDto::getAge).sum();
    System.out.println("總和="+age);
    ​
    double age = userDtos.stream().mapToInt(UserDto::getAge).average().getAsDouble();
    System.out.println("平均值="+age);
    //sum、average、count等屬性,自己可以再探索
  7. 對集合中某金額屬性(BigDecimal)進行計算

    List<UserDto> userDtos = Arrays.asList(
          new UserDto(1, BigDecimal.ONE),
          new UserDto(2, BigDecimal.TEN),
          new UserDto(3, BigDecimal.ZERO)
    );
    BigDecimal money = userDtos.stream().map(UserDto::getMoney).reduce(BigDecimal::add).get();
    System.out.println("總金額="+money);
    ​
    BigDecimal money = userDtos.stream().map(UserDto::getMoney).reduce(BigDecimal::max).get();
    System.out.println("集合中最大金額="+money);
    //add、max、divide、multiply等屬性,自己可以再探索

    目前就用到這麼多,等用到新的再補充!

資料

Java的Stream流式處理

Java 8 Stream

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章