平时开发的优化代码:

· 浏览次数 : 0

小编点评

The provided content covers various aspects of checking for null values and handling different scenarios: **1. Checking for null:** * `Objects.requireNonNull(contactId)` throws an `IllegalArgumentException` if `contactId` is null. * `List.of("a", "a", "a").stream().allMatch(Objects::nonNull)` checks if all elements in the list are not null. **2. Handling multiple conditions:** * `if(Stream.of(InProgress, Queued).anyMatch(status -> Objects.equals(source.getStatusCd(), status))}` checks if the order is in either "InProgress" or "Queued" status. * `if(Arrays.asList(dailyLimit, monthLimit).contains(type)){}` checks if the specified type is within the allowed range. **3. Handling null values:** * `Optional.ofNullable(source.getOrigPoints()).map(BigDecimal::valueOf).orElse(null)` handles null values by converting them to a `BigDecimal` object. * `memTier.setSeqNum(Objects.requireNonNullElse(tier, Tier::new).getSeqNum());` sets the `seqNum` field to the default value if it's null. **4. JSON parsing:** * `String segmentNo = json.optString("SegmentNo")` retrieves the `SegmentNo` from the JSON string. * `String partnerFlag = customerJson.opt("PartnerFlag")` retrieves the `PartnerFlag` from the JSON object. **5. Conditional logic:** * `Optional.ofNullable(memberSegment) .map(existingSegment -> {...}` checks if a member segment already exists and updates it if it does. * `if (isRepeatedOrder.test(posConfirmPointVO)) { handleRepeatedOrder.run(); } else { handleNonRepeatedOrder.run(); }` executes different logic based on whether the order is repeated. **6. Stream operations for handling nulls:** * `Stream.of(apolloServiceConfig.parseItemUrl(), isUpdateBlue ? apolloServiceConfig.parseBlueItemUrl() : Stream.empty())` loads configuration URLs based on the `isUpdateBlue` flag. **7. Stream lambda expression:** * `Optional.ofNullable(posConfirmReqVO.getAccounts()) .filter(accounts -> !accounts.isEmpty()) .flatMap(accounts -> accounts.stream() .filter(acc -> \"1000\".equals(acc.getId())) .findFirst()) .ifPresent(x -> posConfirmReqVO.setAccount1000Value(x.getEarnValue()))` updates the `account1000` value with the first non-empty account's earning. **8. Optimizing conditional checks:** * The new code uses an `if`-`else` block for improved readability and avoids the need for separate `if` conditions. **9. Jdk9 optimization:** * The code uses lambda expressions and `Stream` operations for improved readability and performance. **10. Stream optimization:** * The new code uses `Optional` to handle null values and returns the relevant object or a default value.

正文

第一: 检验,报错直接抛出异常: Objects.requireNonNull(contactId);

第二:方法名,检查是否需要输出日志: if(printLogIfNeeded)   //对于sql查询方法、java中的方法名字的命名定义推荐: find..By/query..By/get..By

// 检验查询结果是否 业务需要返回的code
CustomerBuPO customerBu = Optional.ofNullable(foundationRepository.getBuByName(reqVO.getBuId()))
           .orElseThrow(() -> new BusinessException(101, "buId not exist"));

第三:三个字段都不为null的情况下执行的代码;

if (List.of("a", "a", "a").stream().allMatch(Objects::nonNull)) {
    System.out.println("3个对象都不为空");
}

第四:其中有2个条件任一匹配到:

   if(Stream.of(InProgress, Queued).anyMatch(status -> Objects.equals(source.getStatusCd(), status))){ }

或者:if(Arrays.asList(dailyLimit, monthLimit).contains(type)){}

或者:StringUtils.equalsAny(a,b,c)  //只要有一个不为空

第五:如果为null值,但是要转换字段类型取值,都可以用这种方法:

CustomerLoyTxnStg loyTxnStg = new CustomerLoyTxnStg();
loyTxnStg.setOrigPoints(Optional.ofNullable(source.getOrigPoints()).map(BigDecimal::valueOf).orElse(null));
或者:
memTier.setSeqNum(Objects.requireNonNullElse(tier, Tier::new).getSeqNum());
或者:
String birthDay = StringUtils.defaultIfEmpty(contact.getCustomBirthdayDay(), "1");
或者:

1. 判断为null给默认值:

String pointValue = posReqVO.getAccount1000Value() == null? "0":posReqVO.getAccount1000Value();
String pointValue = Optional.ofNullable(posReqVO.getAccount1000Value()).orElse("0");

第六:这是一种常见的 JSON 解析操作,它会尝试获取指定字段的值,如果该字段不存在或为 null,则返回空字符串 ""。

String segmentNo = json.optString("SegmentNo")
String partnerFlag = customerJson.opt("PartnerFlag");
JSONObject jsonObject = customer.optJSONObject("Segments");

第七:jdk9及其以上:ifPresentOrElse() 的新方法。没有用jdk9,但是jdk8这样也能实现:

Optional.ofNullable(memberSegment)
            .map(existingSegment -> {
                CustomerLoyMemberSegmentPO updateSegmentPO = initMemberSegmentPO(memberCard, partnerCardDefnPO)
                    .setEndDate(null).setLastUpdated(DateUtils.utcNow());
                memberSegmentRepository.updateSegmentByIdAndSegNum(updateSegmentPO);
                return existingSegment;
            })
            .orElseGet(() -> {
                memberSegmentRepository.insert(memberSegmentPO);
                return null;
            });

第八:优化 if else,不想用if else,也可以考虑用函数式断言Predicate或BiPredicate 校验。

1:用三元运算和 Consumer 改造:
Consumer<List<CustomerLoyOrderTxnPO>> insertOperation = posConfirmPointVO.getIsRepeatedOrderFlag() ?
                        orderTxnRepository::signleInsertLoyCustomerTxnOrder :
                        orderTxnRepository::batchInsertLoyCustomerTxnOrder;
                insertOperation.accept(orderTxnsList);
2:使用三元运算符,最简单实现。
3:用Predicate检验改造: // 判断是否重复订单的条件 Predicate<PosConfirmPointVO> isRepeatedOrder = PosConfirmPointVO::getIsRepeatedOrderFlag; // 定义处理重复订单的逻辑 Runnable handleRepeatedOrder = () -> checkInsertCustomerBueventTxn(bueventTxnPO, account, buEventAccountDefnXmPOS);
// 定义处理非重复订单的逻辑 Runnable handleNonRepeatedOrder = () -> { customerBueventTxnRepository.insertCustomerBueventTxn(bueventTxnPO); upsertBueventAccountByType(memberId, eventId, account, buEventAccountDefnXmPOS); }; // 根据订单是否重复执行不同的逻辑 if (isRepeatedOrder.test(posConfirmPointVO)) { handleRepeatedOrder.run(); } else { handleNonRepeatedOrder.run(); }

第九:用jdk8 优化旧代码:

1. 旧代码:
    String authToken = getAuthToken();
    updateApolloConfig(count, authToken, apolloServiceConfig.parseItemUrl());

    if (isUpdateBlue) {
        updateApolloConfig(count, authToken, apolloServiceConfig.parseBlueItemUrl());
    }
 这样不更好:    
    Stream.of(apolloServiceConfig.parseItemUrl(),
                isUpdateBlue ? apolloServiceConfig.parseBlueItemUrl() : Stream.empty())
        .forEach(url -> updateApolloConfig(count, getAuthToken(), url)); 
        
2. 旧代码:
    List<Account> accounts = posConfirmReqVO.getAccounts();
    if (accounts.isEmpty()) {
        return;
    }
    accounts.stream()
        .filter(acc -> "1000".equals(acc.getId()))
        .findFirst()
        .ifPresent(x -> posConfirmReqVO.setAccount1000Value(x.getEarnValue()));
        
 这样更好:    
     Optional.ofNullable(posConfirmReqVO.getAccounts())
            .filter(accounts -> !accounts.isEmpty())
            .flatMap(accounts -> accounts.stream()
                .filter(acc -> "1000".equals(acc.getId()))
                .findFirst())
            .ifPresent(x -> posConfirmReqVO.setAccount1000Value(x.getEarnValue()));

与平时开发的优化代码:相似的内容:

平时开发的优化代码:

第一: 检验,报错直接抛出异常: Objects.requireNonNull(contactId); 第二:方法名,检查是否需要输出日志: if(printLogIfNeeded) //对于sql查询方法、java中的方法名字的命名定义推荐: find..By/query..By/get..By

《优化接口设计的思路》系列:第一篇—接口参数的一些弯弯绕绕

前言 大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 作为一名从业已达六年的老码农,我的工作主要是开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接

《优化接口设计的思路》系列:第二篇—接口用户上下文的设计与实现

前言 大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 作为一名从业已达六年的老码农,我的工作主要是开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接

《优化接口设计的思路》系列:第三篇—留下用户调用接口的痕迹

前言 大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 作为一名从业已达六年的老码农,我的工作主要是开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接

《优化接口设计的思路》系列:第四篇—接口的权限控制

前言 大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 作为一名从业已达六年的老码农,我的工作主要是开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接

《优化接口设计的思路》系列:第十一篇—表格的导入导出接口优化

一、前言 大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 作为一名从业已达六年的老码农,我的工作主要是开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,

《优化接口设计的思路》系列:第十篇—网站的静态资源怎么获取?

一、前言 大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 作为一名从业已达六年的老码农,我的工作主要是开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,

不只是负载均衡,活字格智能集群的架构与搭建方案

还在单机服务器,时刻面临宕机风险吗? 优化程度不够,响应速度缓慢,系统工作响应像老汉拉车吗? 为了帮助大家具备企业级应用的部署能力,轻松应对核心业务系统的部署要求,我们准备了《活字格智能集群的架构与搭建方案》高级教程。 作为一款优秀的企业级低代码开发平台,活字格除了本身开发集成的强大功能之外,负载均

活字格性能优化技巧(1)——如何利用数据库主键提升访问性能

本文由葡萄城技术团队于博客园原创并首发转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 大家都知道,活字格作为企业级低代码开发平台,拥有6大引擎,3大能力,能够高效落地企业级应用。在每年的应用大赛中也能看到很多格友利用活字格做了很多复杂的应用,例如2021年

Ui2Code+ChatGPT助力低代码搭建

低代码开发平台(LCDP),是低代码或无代码通过快速搭建配置的方式完成一个应用程序的开发与上线,可视化低代码就是可视化的DSL,它的优点更多的是来源可视化,相对的,它的局限性也还是来源于可视化,复杂的业务逻辑用低代码可能会更加复杂。低代码应该是特定领域问题的简化和抽象,如果只是单纯将原有的编码工作转换为 GUI 的模式,并没有多大意义。