
一时 stream 一时爽,用习惯了以后,突然想到对于流,能否实现过滤和 map 同时进行的操作,比如一个场景:
// 如果元素是奇数,就 + 1,如果元素是偶数,就 +2,期望一顿流式操作后,输出一个新的 List:{2,4,4,6,6} List<Integer> input = Arrays.asList(1, 2, 3, 4, 5); inputList.stream() .filter(p -> xxx) .map(p -> xxx) .collect(Collectors.toList()); 现在最高频用到的 filter 通常只有一个条件,是从原来的 List 中过滤出满足条件的元素,然后对这些元素进行 map 操作,
如果对一个集合,有两种过滤条件 A 和 过滤条件 B,满足过滤条件 A 就对元素进行 mapA 操作,满足过滤条件 B,就对元素进行 mapB 操作,最后元素都按照不同的 map 方式映射完了,再放到同一个集合里~~
初用 stream,有大佬这样操作过嘛~~
1 chanchan 2020 年 11 月 20 日 peek 了解一下 |
2 wowo243 2020 年 11 月 20 日 partitioningBy()? |
3 ye2moe 2020 年 11 月 20 日 直接的话是做不到的,可以搞两个流操作再合起来就好了。 |
4 easterfan OP @wowo243 @ye2moe ```java Map<Boolean, List<Integer>> partitiOnMap= Stream.of(1, 2, 3, 4, 5).collect(Collectors.partitioningBy(p -> p / 2 == 0)); Stream<Integer> evenStream = partitionMap.get(true).stream().map(p -> p + 2); Stream<Integer> oddStream = partitionMap.get(false).stream().map(p -> p + 1); Stream.concat(evenStream, oddStream); ``` 分组成两个流,然后再合并,合并后的流和原来的流元素顺序不一样了~~ |
5 anzu 2020 年 11 月 20 日 为什么要 filter,奇偶不是二选一吗。如果判断条件复杂,要么 map 里面多写点代码,要么用 for input.stream().map(p -> p % 2 == 0 ? p + 2 : p + 1).collect(Collectors.toList()) |
6 easterfan OP @anzu 感谢大佬!解决了我的问题,用 map 前总是很习惯的 filter 一下,有了思维定式,用你的思路,把判断逻辑写在 map 里,对一个元素 map 前先做一次判断,然后执行对应的 map,已经达到了我在找的一边 filter,一边 map 的想法,感谢! ```java Stream.of(1,2,3,4,5) .map(p -> {if(isFilterA) mapA(); if (isFilterB) mapB(); if (isFilterC) mapC();}) .collect(Collectors.toList()); ``` (原来的固定思维的想法~:) https://imgur.com/7sn8euR |
7 jimmyismagic 2020 年 11 月 20 日 @easterfan filter 概念要搞清楚啊,没事干嘛搞 filter |
8 optional 2020 年 11 月 20 日 via iPhone rx 欢迎你 |
9 easterfan OP @jimmyismagic 母鸡啊~写顺手了,map 前必 filter~~Q |
11 jimmyismagic 2020 年 11 月 20 日 @easterfan rxJava,另外还有 project reactor,都是响应式编程,但其中也使用了 streams 里的一些概念 |
12 itechify PRO 在 map 里面直接判断 A 或 B 条件分开转换就行了吧 借楼,题外话,最近密的 stream 的另一个 API,Collectors.mapping,真是节省了不少代码逻辑,主要用于 group 分组后的 value 集合再 map ttps://stackoverflow.com/questions/52281724/java-streams-group-list-entries-based-on-a-property-but-collect-a-property-of-ob 知道这个 API 的大佬请忽略 |
13 zch693922 2020 年 11 月 21 日 |
14 easterfan OP @zch693922 @chanchan 感谢回答!最近试了 map 和 peek 两种实现方式,实践后发现可能 map 更适用这种情况,具体原因是使用 peek 后续再进行终端操作(比如 collect/count )时,会出现报错:`java.lang.UnsupportedOperationException`, peek 可能只适合调试的场景,个人解释能力有限,感兴趣的话这篇文章举的例子挺好的: https://stackoverflow.com/questions/44370676/java-8-peek-vs-map |