lambda函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数。
函数式编程的好处
parallelization 并行:所谓并行的意思就是在并行环境下,各个线程之间不需要同步或互斥。
lazy evaluation 惰性求值:这个需要编译器的支持。表达式不在它被绑定到变量之后就立即求值,而是在该值被取用的时候求值,也就是说,语句如x:=expression; (把一个表达式的结果赋值给一个变量)明显的调用这个表达式被计算并把结果放置到 x 中,但是先不管实际在 x 中的是什么,直到通过后面的表达式中到 x 的引用而有了对它的值的需求的时候,而后面表达式自身的求值也可以被延迟,最终为了生成让外界看到的某个符号而计算这个快速增长的依赖树。
determinism 确定性:所谓确定性的意思就是像数学那样 f(x) = y ,这个函数无论在什么场景下,都会得到同样的结果,这个我们称之为函数的确定性。而不是像程序中的很多函数那样,同一个参数,却会在不同的场景下计算出不同的结果。所谓不同的场景的意思就是我们的函数会根据一些运行中的状态信息的不同而发生变化。
一、快速遍历list
二、快速遍历map
三、从普通编写和函数式、stream流操作对比
1、计算符合预期的数量
//计算已经中标的数量
int winBidCount= (int) biddingList.stream().map(bidding -> winBiddingDao.findByBidId(bidding.getId())).filter(winBidding -> !StringUtils.isEmpty(winBidding)).count();
2、计算目标值的和
subContractList.stream().mapToDouble(s -> winBiddingDao.findById(s.getWinbidId()).get().getBudget().doubleValue()).sum();
案例:
1.批量查询数据库组装数据思路
场景:有领导表(leader) 政府机构机构表(org), 这两表之间的关联为leader中有个orgId字段, 人员的分页查询时, 只是针对leader表进行分页查询, 这样的话,我们查出来的人员是不带部门名称的,只有orgId,所以我们需要再去org表中查询这些人员的部门名称,如果使用for循环,在循环中去查询,那么这个循环有几次,就会请求几次数据库,造成性能的浪费, 此时,可以把需要查询的orgId组装起来,只查询一次。
另外,如果这个list的size不是很大,比如是50以内的话,第二步的查询,可以不用限制mongodb输出文档的字段,可以直接将第二部简化成一下写法,这是因为几十条的数据从mongodb中查询出来组装成java对象是一个非常快的过程:
List<Org> orgList = orgDao.findByIdIn(orgIds);