1、Stream流

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如 筛选 (filter), 排序 (sorted), 映射 (map) 聚合 (collect)等。 元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

1203840-20190505142834342-1673660014.png
如:

  1. List<Integer> transactionsIds =
  2. widgets.stream()
  3. .filter(b -> b.getColor() == RED) // 过滤
  4. .sorted((x,y) -> x.getWeight() - y.getWeight()) // 排序
  5. .mapToInt(Widget::getWeight) // 映射(变换数据)
  6. .sum(); // 聚合

官方给出的例子:

  1. int sum = widgets.stream().filter(w -> w.getColor() == RED).mapToInt(w -> w.getWeight()).sum();

1356:

  1. class Solution {
  2. public int[] sortByBits(int[] arr) {
  3. return Arrays.stream(arr).boxed().sorted((o1, o2)->{
  4. int t = Integer.bitCount(o1.intValue()) - Integer.bitCount(o2.intValue());
  5. if (t != 0)
  6. return t;
  7. else return o1 < o2 ? -1 : 1; // -1和1是可以变化的,只要保证后面大于前面就行!
  8. }).mapToInt(i->i).toArray();
  9. }
  10. }
  • boxed()是 IntStream 的一个APi,其作用为: 返回一个包含所有Integer元素的stream流
  • bitCount()是 Integer 的APi表示 返回二进制表示的数中,所有1的个数
  • Arrays.stream(int[] array): Returns a sequential IntStream with the specified array as its source.
  • Arrays.sort(T[] a, Comparator<? super T> c): Sorts the specified array of objects according to the order induced by the specified comparator.
    1. Arrays.sort(nums, (o1, o2) -> {
    2. int bitCountA = Integer.bitCount(o1);
    3. int bitCountB = Integer.bitCount(o2);
    4. // 相同按原数,不同按位数
    5. return bitCountA == bitCountB ? o1 - o2 : bitCountA - bitCountB;
    6. });
  1. List<String> list = Arrays.stream(s.split("")).sorted().collect(Collectors.toList());
  2. StringBuilder stringBuilder = new StringBuilder();
  3. while(list.size() != 0) {
  4. for(String value : list.stream().distinct().collect(Collectors.toList()) {
  5. stringBuilder.append(value);
  6. list.remove(value);
  7. }
  8. Collections.reverse(list);
  9. }
  10. return stringBuilder.toString();

哪些数据结构能够使用stream流操作

  • list.stream()
  • Arrays.stream(arr)