Java8 函数式编程——基础篇

本文介绍了Java8的函数式编程基础,包括函数是"第一等公民"和不可变性特性。讨论了为何使用函数式编程,如代码简洁、并行执行等优势,并通过批量并行获取工号的例子进行说明。讲解了lambda表达式、变量作用域、Stream、并行流和异常处理。此外,重点探讨了Optional的使用场景、优势以及在开发中应注意的事项,如避免使用Optional作为字段和参数。文章还提到了函数式编程与面向对象编程的区别,并提醒读者注意Stream操作中的潜在问题,如聚合陷阱。最后,提到了一些其他相关的知识点,如性能优化和函数式接口的应用。
摘要由CSDN通过智能技术生成

函数式编程

一种编程范式,它将电脑运算视为函数运算,并且避免使用程序状态以及易变对象。其中,λ演算(lambda calculus)为该语言最重要的基础。

特性

函数是“第一等公民”

函数与其他数据类型一样,可以赋值给其他变量,也可以作为参数,也可以作为返回值

不可变性

像闭包一样,传入的自由变量是不可变的,降低数据的不一致性。同时也只返回新的值,不修改变量状态,没有“副作用”。

为什么使用

  • 代码简洁,开发快速
  • 易于理解,降低风险
  • 易于并行
  • 延迟执行

例: 根据用户名批量并行获取工号

Before

public List<String> listEmployIds(List<String> usernames) throws Exception {
   
        CountDownLatch countDownLatch = new CountDownLatch(usernames.size());
        ConcurrentHashMap<String, UserDTO> mapping = new ConcurrentHashMap<>();
        for (String username : usernames) {
   
            ThreadPoolUtil.execute(() -> {
   
                UserDTO user = userService.getUserDetail(username);
                mapping.put(username, user);
                countDownLatch.countDown();
            });
        }
        countDownLatch.await();
        List<String> employIds = new ArrayList<>(usernames.size());
        for (UserDTO user : mapping.values()) {
   
            employIds.add(user.getEmployeeId());
        }
        return employIds;
    }

After

public List<String> listEmployIds(List<String> usernames) throws Exception {
   
      return usernames.parallelStream().map(userService:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值