跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Java8 Stream 流一边 filter 过滤一边 map 映射??
未分類
15 11 月 2020

Java8 Stream 流一边 filter 过滤一边 map 映射??

Java8 Stream 流一边 filter 过滤一边 map 映射??

資深大佬 : easterfan 4

一时 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,有大佬这样操作过嘛~~

大佬有話說 (13)

  • 資深大佬 : chanchan

    peek 了解一下

  • 資深大佬 : wowo243

    partitioningBy()?

  • 資深大佬 : ye2moe

    直接的话是做不到的,可以搞两个流操作再合起来就好了。

  • 主 資深大佬 : easterfan

    @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);
    “`
    分组成两个流,然后再合并,合并后的流和原来的流元素顺序不一样了~~

  • 資深大佬 : anzu

    为什么要 filter,奇偶不是二选一吗。如果判断条件复杂,要么 map 里面多写点代码,要么用 for
    input.stream().map(p -> p % 2 == 0 ? p + 2 : p + 1).collect(Collectors.toList())

  • 主 資深大佬 : easterfan

    @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

  • 資深大佬 : jimmyismagic

    @easterfan filter 概念要搞清楚啊,没事干嘛搞 filter

  • 資深大佬 : optional

    rx 欢迎你

  • 主 資深大佬 : easterfan

    @jimmyismagic 母鸡啊~写顺手了,map 前必 filter~~Q

  • 主 資深大佬 : easterfan

    @optional
    敢问 rx 是?这 id 很 6

  • 資深大佬 : jimmyismagic

    @easterfan rxJava,另外还有 project reactor,都是响应式编程,但其中也使用了 streams 里的一些概念

  • 資深大佬 : oneisall8955

    在 map 里面直接判断 A 或 B 条件分开转换就行了吧

    借,题外话,最近密的 stream 的另一个 API,Collectors.mapping,真是节省了不少代码逻辑,主要用于 group 分组后的 value 集合再 map

    https://stackoverflow.com/questions/52281724/java-streams-group-list-entries-based-on-a-property-but-collect-a-property-of-ob

    知道这个 API 的大佬请忽略

  • 資深大佬 : zch693922

    按一的 peek 一下就可以了
    list.stream().peek(item -> {
    if (xxxxx) { do something}
    if (xxxx) {item.setXXX}
    })

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具