一路狂飙

Java编程之Stream表达式

定义

Stream特性是java8中引入的。从名字来看,Stream就是一个流, 它的主要作用就是对集合数据进行查找过滤等操作。 有点类似于SQL的数据库操作。一句话来解释就是一种高效且易用的数据处理方式。

与Collection的区别

  • Collection负责存储数据,不对数据做其他处理,主要是和内存打交道。
  • Stream主要是负责计算数据的,主要是和CPU打交道。

创建Stream

// 通过集合类型创建Stream
List<Integer> intList = new ArrayList<>();
intList.add(1);
intList.add(2);
intList.add(3);
Stream<Integer> intStream1 = intList.stream();
int sum = intStream1.reduce(1,Integer::sum);
System.out.println(sum);

// 通过数组创建Stream
Integer[] intArray = new Integer[]{1,2,3,4,5,6,7};
Stream<Integer> intStream2 = Arrays.stream(intArray);

// 通过Stream.of创建
Stream<Integer> intStream3 = Stream.of(1,2,3,4,5,6);

// 创建一个无限流
Stream.generate(Math::random)
        .limit(5)
        .forEach(System.out::println);

数据操作

Stream在关闭以后不能被重复使用。

筛选和切片

Integer[] intArray = new Integer[]{1,2,3,3,4,6,7};
Arrays.stream(intArray).filter(item->item > 2).forEach(System.out::println);
Arrays.stream(intArray).limit(3).forEach(System.out::println);
Arrays.stream(intArray).skip(5).forEach(System.out::println);
Arrays.stream(intArray).distinct().forEach(System.out::println);

映射

List<String> strList = Arrays.asList("zhangsan", "lisi", "wangwu");
strList.stream().map(String::toUpperCase).forEach(System.out::println);

排序

Stream<Integer> intStream4 = Stream.of(122,23,34,44,15,6);
intStream4.sorted((i1,i2)->Integer.compare(i2, i1)).forEach(System.out::println);

匹配和查找

Integer[] intArray2 = new Integer[]{1,2,3,3,4,6,7};
boolean allmatch = Arrays.stream(intArray).allMatch(item -> item > 0);
boolean anymatch = Arrays.stream(intArray).anyMatch(item -> item > 5);
boolean noneMatch = Arrays.stream(intArray).noneMatch(item -> item > 5);
long count = Arrays.stream(intArray).filter(item->item > 3).count();

归约

Stream<Integer> intStream5 = Stream.of(122,23,34,44,15,6);
int streamSum = intStream5.reduce(0, Integer::sum);

收集

Stream<Integer> intStream6 = Stream.of(122,23,34,44,15,6);
List<Integer> listStrem6 = intStream6.filter(item->item>30).collect(Collectors.toList());

Stream<Integer> intStream7 = Stream.of(122,23,34,44,15,6);
Set<Integer> setStrem7 = intStream6.filter(item->item>30).collect(Collectors.toSet());