《Java8函数式编程》读书小记

  • 设计匿名内部类的目的,就是为了方便Java程序员将代码作为数据传递。
  • 匿名内部类引用外部的变量,变量必须声明为final;Java8可以引用“非final变量”,但是该变量在既成事实上必须是final。Lambda表达式引用的是值,而不是变量。
  • Lambda表达式也被称为闭包。
  • Lambda表达式是一个匿名方法,将行为像数据一样进行传递。
  • filter这样只描述Stream,最终不产生新集合的方法叫作惰性求值方法;而像count这样最终会从Stream产生值得方法叫作及早求值方法
  • 判断一个操作是惰性求值还是及早求值很简单:只需看它的返回值。如果返回值是Stream,那么是惰性求值;如果返回值是另一个值或为空,那么就是及早求值。使用这些操作的理想方式就是形成一个惰性求值的链,最后用一个及早求值的操作返回想要的结果。
  • 可以在集合类上级联多种操作,但迭代只需一次。
  • flatMap方法的相关函数接口和map方法的一样,都是Function接口,只是方法的返回值限定为Stream类型罢了。
  • reduce操作可以实现从一组值中生成一个值,count,min,max方法因为常用而被纳入标准库中,事实上,这些方法都是reduce操作。
BinaryOperator<Integer> accumulator = (acc,element) -> acc + element;
        int count = accumulator.apply(
                accumulator.apply(
                        accumulator.apply(0, 1), 
                        2), 
                3);
  • 尽量编写没有副作用的函数:不会改变程序或外界的状态。
  • 鼓励用户使用Lambda表达式获取值而不是变量。
  • 整型在内存中占用4字节,整型对象却要占用16字节。
  • 类中重写的方法优先级高于接口中定义的默认方法。越具体优先级越高。
  • Classname::methodName,凡是使用Lambda表达式的地方,就可以使用方法引用。
  • 方法引用自动支持多个参数,前提是选对了正确的函数接口。
  • String[]::new
  • 收集器可用来计算流的最终值,是reduce方法的模拟。
  • 收集器(Collector)就是累加->结合->转换。
  • 收集器大部分使用Collectors类的工厂方法来获得。
  • 并发是两个任务共享时间段,并行则是两个任务在同一时刻发生。
  • 数据并行化是指将数据分成块,为每块数据分配单独的处理单元。
  • 在底层,并行流还是沿用了fork/join框架。
  • 影响并行化的五要素:数据大小(越大越好),源数据结构(越易拆分越好。比如ArrayList比LinkedList好),值是否装箱(不装箱好效率好),可用的CPU数量,以及处理每个元素所花的时间(花在处理元素上的时间相对拆分数据等时间越多越好)。
  • 任何Lambda表达式都能被改写为普通方法,然后使用方法引用直接引用。
  • peek方法可用让你查看每个值,同时能继续操作流。

总结,要系统学习还是看《java8实战》 吧。
-

猜你喜欢

转载自blog.csdn.net/a_842297171/article/details/80808641