Stream常用操作

本文深入探讨了Java Stream API的核心操作,包括map、filter、peek、forEach和sorted。Stream的特点包括惰性化执行、支持并行化以及单向不可逆。中间操作如map和peek在不改变流的基础上进行转换和查看,而终端操作如filter和forEach则终结流。sorted操作允许在执行各种操作后对Stream进行高效排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Stream 操作的 总览详解: https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/

Stream的特点
  • 惰性化:惰性化的操作意思是,在执行Intermediate操作时,不立马执行,而是把这些函数放起来,当在执行Terminal操作时,一起执行Intermediate操作
  • 支持并行化操作
  • Stream流是单向的,不可往复的
流的操作类型

Intermediate(中间操作):中间操作时惰性(lazy)的,执行指定的操作后,返回一个新的Stream流。后面还可以继续接着操作流。

Terminal(终端操作):当使用Terminal操作后,流就结束了,后面不能再继续操作流,这是流的最后一个操作。

Stream操作
1.map 返回由指定函数应用于stream流的元素的结果 组成的流,即流中的每个元素都执行操作,然后返回执行操作后的元素再组成一个流,并且返回它。

map 生成的是个 1:1 映射,每个输入元素,都按照规则转换成为另外一个元素

Stream<T> map(Function<? super T,? extends R> mapper)

举个例子:

//这里返回的的是imgs2的List过滤后的所有ImageUrl流,并且使用collect()
shopInfoDto.setLicenseImgs(imgs2.stream().map(p->p.getImageUrl()).
collect(Collectors.toList()));

//转换为大写
List<String> output = wordList.stream().
map(String::toUpperCase).
collect(Collectors.toList());

//平方数
List<Integer> nums = Arrays.asList(1, 2, 3, 4);
List<Integer> squareNums = nums.stream().
map(n -> n * n).
collect(Collectors.toList());

2.filter:过滤出 满足Lamda表达式predicate元素的的流
Stream<T> filter(Predicate<? super T> predicate) 

举个例子

List<BagOrderEntity> expArrivalList = waitDepositeList.stream()
.filter(s -> s.getExpArrivalTime().after(time))
.collect(Collectors.toList());
3.peek:返回由该流的元素组成的流,另外在从生成的流中消耗元素时对每个元素执行提供的操作。
Stream<T> peek(Consumer<? super T> action)

举个例子

<!--该方法主要用于支持调试,您希望在流程中流过某个特定点时查看元素:-->
   Stream.of("one", "two", "three", "four") 
   .filter(e -> e.length() > 3) 
   .peek(e -> System.out.println("Filtered value: " + e)) 
   .map(String::toUpperCase) 
   .peek(e -> System.out.println("Mapped value: " + e)) .collect(Collectors.toList());  
4.forEach:遍历元素。接收一个Lamda表达式,Stream流中每个元素,执行Lamda表达式方法中的操作。

注意:forEach 不能修改自己包含的本地变量值,也不能用 break/return 之类的关键字提前结束循环。并且foreach是Terminal操作,执行到这个方法,流已经结束啦!=

void forEach(Consumer<? super T> action) 

举个例子:

roster.stream()
 .filter(p -> p.getGender() == Person.Sex.MALE)
 .forEach(p -> System.out.println(p.getName()));

peek: 可以到达遍历的效果,但是peek是属于Intermediate操作的,执行遍历操作以后,还会返回一个新的Stream流

Stream.of("one", "two", "three", "four")
 .filter(e -> e.length() > 3)
 .peek(e -> System.out.println("Filtered value: " + e))
 .map(String::toUpperCase)
 .peek(e -> System.out.println("Mapped value: " + e))
 .collect(Collectors.toList());
5.sorted : 对 Stream 的排序通过 sorted 进行
Stream<T> sorted()

//使用特定的比较器来排序
Stream<T> sorted(Comparator<? super T> comparator)

优点:相对于数组排序:它比数组的排序更强之处在于你可以首先对 Stream 进行各类 map、filter、limit、skip 甚至 distinct 来减少元素数量后,再排序,这能帮助程序明显缩短执行时间

举个例子

List<Person> persons = new ArrayList();
 for (int i = 1; i <= 5; i++) {
 Person person = new Person(i, "name" + i);
 persons.add(person);
 }
List<Person> personList2 = persons.stream().limit(2).sorted((p1, p2) -> p1.getName().compareTo(p2.getName())).collect(Collectors.toList());
System.out.println(personList2);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值