坑爹代码 | Stream 玩得最 6 的代码,看过的人都惊呆了

红薯
 红薯
发布于 2019年06月11日
收藏 57

Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。

图 1.  流管道 (Stream Pipeline) 的构成

那么 Java 8 的 Stream 到底是王者,还是个巨坑,这完全取决于你是怎么玩的?

我不得不说,下面代码是我从业 20 年(说谁呢,谁从业 20 年,我今年 19  岁!!!)看过最牛逼的 Stream 的用法:

Optional.of(req)
        .map(e -> e.clueUid)
        .map(id -> {
            final ClueExample example = new ClueExample();
            example.createCriteria()
                    .andClueUidEqualTo(id)
                    .andDeletedEqualTo(false)
                    .andReceivedEqualTo(false)
                    .andCreateTimeGreaterThan(now - cluetime);
            example.setOrderByClause("create_time asc");
            return example;
        })  // 获取该被邀请人所有未过期且未被领取的线索的线索
        .map(clueMapper::selectByExample)
        .filter(StringUtil::isNotEmpty)
        .ifPresent(clues -> {
                    final ClueResp clueResp = Optional.of(req)
                            .filter(c -> {
                                c.count = clues.size();
                                return true;
                            })
                            .map(this::awardValue)
                            .orElseThrow(() -> ExceptionUtil.createParamException("参数错误"));
                    final Integer specialId = req.getIsHead()
                            ? clues.get(0).getId()
                            : clues.get(clues.size() - 1).getId();
                    clues.stream()
                            .peek(clue -> {
                                final AwardConfig awardConfigclone = Optional.of(awardConfig)
                                        .map(JSONUtil::obj2Json)
                                        .map(json -> JSONUtil.json2Obj(json, AwardConfig.class))
                                        .orElseGet(AwardConfig::new);
                                awardConfigclone.setMoney(
                                        Optional.of(clue.getId())
                                                .filter(specialId::equals)
                                                .map(e -> clueResp.specialReward.longValue())
                                                .orElse(clueResp.otherAverageReward.longValue())
                                );
                                eventActionService.assembleAward(
                                        awardConfigclone,
                                        clue.getAdviserUid(),
                                        clue.getAdviserUid(),
                                        clue.getClueUid(),
                                        eventAction,
                                        new PasMessageParam(),
                                        clue.getId(),
                                        AwardRelationType.Clud.code()
                                );
                            })
                            .forEach(clue -> {
                                clue.setOrderNo(req.orderNo);
                                clue.setCommodityName(req.commodityName);
                                clue.setOrderAmount(req.orderAmount);
                                clue.setReceived(true);
                                clue.setModifyTime(now);
                                clueMapper.updateByPrimaryKeySelective(clue);
                            });
                }
        );

Java 就是这么一门神奇的语言,任何水平的人都能写出可以运行的代码,但是一看代码便知水平高低。

但是这样的 Stream 代码你一定一口老谈不吐不快,请移步下面链接发表评论,领取奖品:

https://gitee.com/oschina/bullshit-codes/blob/master/java/NBStream.java

码云 6 周年,我们正在征集各种坑爹代码,很多奖品等你来拿

详细的参与方法请看  https://gitee.com/oschina/bullshit-codes

------ 分割线 ------

其他坑爹代码吐槽:

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.aercaste.com]
本文标题:坑爹代码 | Stream 玩得最 6 的代码,看过的人都惊呆了
加载中

精彩评论

KL博客
KL博客
代码还是优先考虑可读性的,这一坨坨的代码没法读啊
p
psc0606
标题党,垃圾文章
Mark哥是我
Mark哥是我
stream操作,大段的方法建议封装出来,做到见名知义,要不然函数式写法的简洁性荡然无存…
honey_fansy
honey_fansy
为什么我觉得可读性挺好的?
slliver
slliver
接手这段代码的人 心中千万只草泥马在奔腾

最新评论(62

-外星人-
-外星人-
感觉挺工整的啊,除了有点长。。。??
LiShixi
LiShixi
多看看就好了
打怪兽的汪
打怪兽的汪
切成几个小方法块会更好
exten
exten
一种特性解所有忧愁,牛逼啊!牛逼啊!牛逼啊!解耦永远是个技术活。代码解耦,功能解耦,模块解耦,系统解耦...,很多速成教程上,很少有教你如何设计API的,如何编写简洁代码的。现在公司追求市场化,不关注这些了??
代码搬运工er
代码搬运工er
抄的4不像,中间各种为空不判断,写起来当然难受
兮若
兮若
来人啊,把写这个代码的贱人给我开除了。
沙罗曼蛇
沙罗曼蛇
不得不说,我们这有比这个更6的
不羁的醒与醉
不羁的醒与醉
果然都是直男,这篇文章的重点是红薯19岁!!!
西方注定失败
西方注定失败
运维接手绝对会把这个祖宗骂一遍
开源中国首席鸭王
开源中国首席鸭王
我想知道这个最终结果集是什么??
返回顶部
顶部