读Java8函数式编程
文章平均质量分 81
读Java8函数式编程笔记及总结和感想
躺柒
书既可以读薄也可以读厚
1. 输出才能检验输入;
2. 分享才能集思广益;
3. 完成才能完善,无限完善才能逼近完美;
4. 万事开头难,坚持更难,长期坚持难上加难。
展开
-
Java8函数式编程读后总结与感想
前文提到的注释就是这样的,不加,也没有多大问题;这就像电动自行车头盔一样,正常情况下,不戴也能正常骑行(当然咯,被警察叔叔抓到就要罚款咯),但是,真正出事故了的时候,是能保命的。同理,重构代码时,那个注释能快速定位,减少排错时间。设计模式不是一成不变的,随着T技术的飞速发展,它也会生老病死,会过时,需要革新,推陈出新。Java8作为java系列的里程碑版本,专门针对Java 8 的这本书是推荐阅读的。影响并行化性能的因素有很多,并行化很可能没有串行快,这需要具体场景具体测试。建议:可有可无,选有。原创 2023-02-11 07:15:00 · 46 阅读 · 0 评论 -
读Java8函数式编程笔记01_Lambda表达式
接口中单一方法的命名并不重要,只要方法签名和Lambda表达式的类型匹配即可。在思考问题时,使用不可变值和函数,函数对一个值进行处理,映射成另一个值。程序依然要经过类型检查来保证运行的安全性,但不用再显式声明类型罢了。Lambda表达式的类型依赖于上下文环境,是由编译器推断出来的。一开始类型信息是有用的,但随后可以只在真正需要时才加上类型信息。关心的是如何写出好代码,而不是符合函数式编程风格的代码。使用Lambda表达式,就是将复杂性抽象到类库的过程。目标类型是指Lambda表达式所在上下文环境的类型。转载 2023-01-26 07:15:00 · 36 阅读 · 0 评论 -
读Java8函数式编程笔记02_流
函数的参数列表里包含函数接口,或该函数返回一个函数接口。代码可读性差,样板代码太多,隐藏了真正的业务逻辑。接受另外一个函数作为参数,或返回一个函数的函数。用函数式编程方式在集合类上进行复杂操作的工具。效率差,每一步都要对流及早求值,生成新的集合。没有副作用的函数不会改变程序或外界的状态。collect(toList())方法。for循环是一个封装了迭代的语法糖。内部迭代中的相应接口:Stream。代表一个可能存在也可能不存在的值。静态方法comparing。有且只有一个抽象方法。实际上是一个函数接口。转载 2023-01-27 07:15:00 · 46 阅读 · 0 评论 -
读Java8函数式编程笔记03_高级集合类和收集器
3.3.4.1. 接受一个Lambda表达式作参数,将流中的元素转换成一个整数,然后再计算平均数3.4.2.1. 接受一个流,并将其分成两部分3.5.2.1. 接受一个分类函数,用来对数据分组3.5.2.2. 类似SQL中的group by操作3.7.2.1. 在收集器的容器上执行类似map的操作。但是需要指明使用什么样的集合类存储结果转载 2023-01-28 07:15:00 · 62 阅读 · 0 评论 -
读Java8函数式编程笔记04_类库
如果一个接口继承了另一个接口,且两个接口都定义了一个默认方法,那么子类中定义的方法胜出。该注释添加给一个枚举类型、类或另一个注释,或者接口包含不止一个抽象方法,javac就会报错。Java中有一些接口,虽然只含一个方法,但并不是为了使用Lambda表达式来实现的。如果在继承链中有方法体或抽象的方法声明,那么就可以忽略接口中定义的方法。如果上面两条规则不适用,子类要么需要实现该方法,要么将该方法声明为抽象方法。接口中定义的包含方法体的方法,方法名有default关键字做前缀。转载 2023-01-29 07:15:00 · 50 阅读 · 1 评论 -
读Java8函数式编程笔记05_数据并行化
一个程序要运行两个任务,并且只有一个CPU给它们分配了不同的时间片,那么这就是并发,而不是并行。和顺序执行的任务量是一样的,区别就像用更多的马来拉车,花费的时间自然减少了。调用parallel或者parallelStream方法实现数据并行化操作。优化任何和计算相关的任务立即变成了如何有效利用现有硬件的问题。为缩短任务执行时间,将一个任务分解成几部分,然后并行执行。将数据分成块,为每块数据分配单独的处理单元。把工作拆分,同时在多核CPU上执行的方式。初值必须为组合函数的恒等值。Java EE应用容器。转载 2023-01-30 07:15:00 · 44 阅读 · 1 评论 -
读Java8函数式编程笔记06_Lambda表达式编写并发程序
在CompletableFuture对象出现异常时,可使用exceptionally方法恢复,可以将一个函数注册到该方法,返回一个替代值。如果你想在链的末端执行一些代码而不返回任何值,比如Consumer和Runnable,就thenAccept和thenRun方法。可使用thenApply方法转换CompletableFuture对象的值,有点像使用Stream的map方法。方法不是返回一个值,而是返回一个Future对象,该对象第一次创建时没有值,但以后能拿它“换回”一个值。转载 2023-01-31 07:15:00 · 162 阅读 · 1 评论 -
读Java8函数式编程笔记07_设计和架构的原则
如果用函数接口表示函数,用Lambda表达式或者方法引用实现这些接口,相比使用继承构建算法,就会得到极大的灵活性。观察者模式被大量应用于基于MVC的GUI工具中,以此让模型状态发生变化时,自动刷新视图模块,达到二者之间的解耦。整体算法的设计是一个抽象类,它有一系列抽象方法,代表算法中可被定制的步骤,同时这个类中包含了一些通用代码。定义一个通用的问题,使用不同的算法来实现,然后将这些算法都封装在一个统一接口的背后。算法的每一个变种由具体的类实现,它们重写了抽象方法,提供了相应的实现。转载 2023-02-01 07:15:00 · 46 阅读 · 1 评论 -
读Java8函数式编程笔记08_测试、调试和重构
因为迭代已交由类库控制,而且很多流操作是惰性求值的,所以使用流时,调试可能会变得更加复杂。不要重复你劳动(Don't Repeat Yourself, DRY)使用Lambda表达式的最简单方式是实现轻量级的测试存根。Lambda表达式没有名字,无法直接在测试代码中调用。单元测试是测试一段代码的行为是否符合预期的方式。Mockito框架有助于更容易地产生测试替身。使用测试替身描述系统中其他模块的期望行为。随着语言的演进,编程习惯也要与时俱进。使用继承只是为了覆盖一个方法。使用流操作替代for循环。转载 2023-02-02 07:15:00 · 64 阅读 · 1 评论