• Jxin
    2021-01-31
    我认为Stream语言设计上有疏忽。 问题: Stream的语意表示一次数据流,或者说一次循环。所以不管是map还是filter都是在这一次循环中每个元素执行的一个job。然而stream却有.parallel()和.sequential()的语意,感觉起来就像是可以随意改变当前这一次数据流的执行方式,但实际上一次数据流只能有一种执行方式。 结论:应该是get出并行的parallelStream()或者get出串行的sequentiaStream(),这样在语意上会更明确些。毕竟执行方式在stream中是一个排他项,他不该被变更。

    作者回复: .parallel()和.sequential(),除非明确地知道执行结果,否则,不要使用。

    
    9
  • Jxin
    2021-01-31
    1.勘误 Optional<Author> author = book.getAuthor(); String name = author.orElse(null); -> String name = author.map(Author::getName).orElse(null); 原理: 因为Optional内部做了判空处理 好处: 更语意化的表达 个人见解: 这里 author.map(Author::getName).orElse(null); 刚开始用时,会觉得map里面会报空指针的问题,因为在执行map时感觉就会抛出异常。个人认为这有违常规java开发的心智模型。因为java开发习惯了null的存在,因而在map中做空判断,就像是在map中偷偷多做了一件事,有点超出预期?

    作者回复: 多谢提示,已经修改。 心智模型就是要不断提升的。

    
    6
  • 桃子-夏勇杰
    2021-01-28
    感觉多写了Optional ,代码变得更加累赘了?毕竟这是一种实现细节,如果混在业务代码里面,是不是也是一种坏味道呢?

    作者回复: 看你怎么评价什么算是累赘了,这是一种减少犯错几率的做法,另外,Optional 本身有很多方法可以简化代码的编写。Optional 也是一种需要习惯的构造块,和函数式编程的其它内容是一样的,需要适应一下,适应之后,它就是和 if、for 之类一样的东西。

    共 2 条评论
    6
  • Geek_344b93
    2021-02-08
    我觉得应该是把Optional给封装到一个模型中,然后模型标记可能@Nullable。一来我认为隐藏了于业务无关的空判断,二来,其他调用者不用再写一个相同的判断语句

    作者回复: 如果有更好的 Optional 解决方案,可能是语法的改进,就像 Groovy 和 Kotlin 那样。

    
    3
  • kougazhang
    2021-11-24
    请教一个问题:业务实践中感觉函数式的扩展性不太好。 比如文中的例子: public ChapterParameters toParameters(final List<Chapter> chapters) { List<ChapterParameter> parameters = chapters.stream() .filter(Chapter::isApproved) .map(this::toChapterParameter) .collect(Collectors.toList()); return new ChapterParameters(parameters); } 这段代码在后续的维护中,经常会出现“后续维护时需要 map 的时候需要加 if 条件,尽早打破循环”的情况。 所以,第一次实现需求时写成老师说的这个样子不难,可是后续随着项目演进还是觉得拆成 for 方便。 这种情况该怎么避免呢?

    作者回复: 本质上,还是不习惯函数式的原语map、filter、reduce,我在《软件设计之美》中专门讲了,不妨去看看。

    共 2 条评论
    2
  • NiceBen
    2021-01-28
    lambda表达式虽然简洁,但是在代码出现bug的时候,不好调试。也许是集合中某个参数问题,但是通过lambda的debug时,没办法精确定位到。

    作者回复: 现在的IDE可以在lambda里设置断点,也还好,不过,还是写测试更好。

    
    2
  • adang
    2021-01-28
    对于 Optional,在 Ruby 上早期会用 try 后来版本升级改为 &. 写起来很方便。 写 Ruby 的那会儿,有很多程序员是从其它语言转过去的,写出来的代码有很多前一种语言的"烙印",团队 Leader 会要求大家时常翻看 Ruby 的代码规范,规范里有明确要求的严格按照规范来,这样尽量保持代码风格统一。

    作者回复: 这是对的,统一风格很重要,这是上一讲的主题。

    
    2
  • Hobo
    2021-01-28
    我是写C#的,像这个列表转换在C#中的体现就是Linq吧,不过一些复杂查询我都写的很长😓😓

    作者回复: 不完全是,Linq 的目标是构建一种查询的方式。

    
    1
  • crtmsvc
    2021-03-06
    非常喜欢这一讲

    作者回复: 可以转发分享给更多的朋友。

    
    
  • Luke
    2021-12-27
    我的经验是,只有了解了新语汇解决什么问题,才能改变自己的编写习惯。 不断学习新的代码风格,不仅要知道如何做,也需要掌握新的代码风格是为了解决什么样的问题而产生的,我觉得这一点很重要,就像之前如果不了解 optional 是为了解决 null 忘记判断,或者在Java 语汇中,判断null 比较繁琐而产生的,那么 optional 对于我充其量是一个语法糖。 很多新特性,在读了郑大的解析后,我才从意识上切换了过来。 受益匪浅!
    
    3