stream流是一串连续的元素序列,可以进行各种操作以实现数据的转换和处理,比如:筛选、排序、聚合。
(1) stream流把对流的操作分为两种:
stream的一些特性:
1.从集合创建,可以调用集合的stream()方法来创建一个stream对象,如下:
List nums = Arrays.aslist(1,2,3,4); Stream stream = nums.stream(); 2.从数组创建,可以调用Arrays类的stream()方法进行创建,如下:
String[] names = {"a","b"}; Stream stream = Arrays.stream(names); 3.通过Stream.of()创建,可以通过Stream.of()方法进行创建,如下:
Stream stream = Stream.of(1, 2, 3, 4, 5); 4.通过 Stream.builder() 创建,当添加的元素个数不确认时,可以使用Stream.builder()创建相应相应的对象,并使用add方法添加元素,如下:
Stream.Builder builder = Stream.builder(); builder.add("A"); builder.add("B"); builder.add("C"); Stream stream = builder.build(); 5.通过生成器创建,可以使用Stream.generate()方法和Stream.iterate()方法,如下:
Stream stream1 = Stream.iterate(() -> 0).limit(3); // 3个0 Stream stream2 = Stream.generate(0,n -> n + 1).limit(3); 三、常见的中间操作符
1.筛选(Filter),filter()方法接受一个函数作为参数,用于过滤Stream中的元素,只有满足函数要求的元素才会被保留,如下:
Stream stream = Stream.of(1,2,3,4,5); Stream filtered = stream.filter(n -> n % 2 == 0 ) ; // 偶数 2.映射(Map),map()方法接受一个函数作为参数,用于对stream流中的数据进行映射转换,在之后会构成一个新的stream流。
3.扁平映射(FlatMap),与map不同之处在于它先将每个值都换成另一流,然后再将所有流连接成一个流,其主要解决嵌套集合的问题。如下:
Stream stream = stream.of(1,2,3,4); Stream mapped = stream.map(x -> x + 3); // 每个+3 List> nestedList = Arrays.asList( Arrays.asList(1, 2), Arrays.asList(3, 4), Arrays.asList(5, 6) ); Stream flattenedStream = nestedList.stream().flatMap(List::stream); // 扁平化为一个流
4.聚合(max、min、count),主要用来对数据进行统计,类似于MySQL中的,其中max,min返回的是Optional对象,如下:
Stream stream = Stream.of(1,2,3,4,5); Optional max1 = stream.max(Integer::compareTo); System.out.println("自然排序的最大值:" + max1.get()); 其中Optional对象,主要用于解决空指针异常的问题,Optional类可以是一个null的容器对象,如果值存在则isPresent()返回true,可以调用get()获取该对象。
5.截断操作(limit 和 skip)
如下:
Stream stream = Steam.of(1,2,3,4); Stream limited = stream.limit(2); Stream skipped = steam.skip(2); 四、Stream的终端操作符
1.ForEach,它接受一个Consumer函数作为参数,对流中的每个元素执行该函数。如下:
List names = Arrays.asList("A","b"); names.stream.ForEach(System.out::println); 2.聚合操作(reduce和collect)
如下:
List numbers = Arrays.asList(1, 2, 3, 4, 5); Optional sum = numbers.stream().reduce((a, b) -> a + b); sum.ifPresent(System.out::println); // 输出结果: 15 List names = Arrays.asList("Alice", "Bob", "Charlie"); String joinedNames = names.stream().collect(Collectors.joining(", ")); System.out.println(joinedNames); // 输出结果: Alice, Bob, Charlie