原创

阿里高阶都会用 ——集合工具、代码架构

你这代码为什么这样写?

你不会用现成的工具吗?

你这代码写出来让人怎么读?

重新优化下吧,看下工程其他模块是怎么写的?

这种Review的 Argue场景在阿里是经常发生的。。。 这体现在代码编写的方方面面,代码结构的设计,代码集合的使用,代码流程的设计原则,代码的命名和使用规范等等等等。

集合工具

今天我们就来看下这段代码:从User数组中获取一个Map结构。

第一种直接创建map结构,并循环put进map对象

ImmutableList<User> userList = ImmutableList.<User>builder()
        .add(User.builder().username("jack").age(12).gender("man").build())
        .add(User.builder().username("john1").age(24).gender("man").build())
        .add(User.builder().username("john2").age(34).gender("man").build())
        .add(User.builder().username("john3").age(46).gender("man").build())
        .add(User.builder().username("john4").age(12).gender("man").build())
        .add(User.builder().username("john5").age(23).gender("man").build())
        .add(User.builder().username("john6").age(45).gender("man").build())
        .add(User.builder().username("john7").age(67).gender("man").build())
        .add(User.builder().username("john8").age(56).gender("man").build())
        .build();


Map<String, Integer> name2Age = new HashMap<>();
for (User user: userList) {
    name2Age.put(user.getUsername(), user.getAge());
}

第二种, 使用流式风格,一行代码搞定这个需求, 并没非常美观, 读起来也非常快和简洁.

ImmutableList<User> userList = ImmutableList.<User>builder()
        .add(User.builder().username("jack").age(12).gender("man").build())
        .add(User.builder().username("john1").age(24).gender("man").build())
        .add(User.builder().username("john2").age(34).gender("man").build())
        .add(User.builder().username("john3").age(46).gender("man").build())
        .add(User.builder().username("john4").age(12).gender("man").build())
        .add(User.builder().username("john5").age(23).gender("man").build())
        .add(User.builder().username("john6").age(45).gender("man").build())
        .add(User.builder().username("john7").age(67).gender("man").build())
        .add(User.builder().username("john8").age(56).gender("man").build())
        .build();

Map<String, Object> name2AgeV2 = userList.stream()
        .collect(Collectors.toMap(user -> user.getUsername() , user -> user.getAge()));

这只是其中一种使用场景,其他的还有List转MultiMap结构,List转为Set,Group进行分组, Partitioning等操作。各种工具的测试代码块都是现成的,30+种api的示例代码。这些测试代码获取方式, 进入文末文主的知识星球,查看文章即可。

alt

轻量扩展性代码架构设计模式

不过瘾? 那再来看看这种代码架构设计。
在一些中台型的服务中,经常会根据业务类型的不同而执行不同的业务逻辑,有时候可以通过策略模式来实现代码扩展性的特性,但是策略模式代码规模比较大,会为每个业务创建一个策略实现类,如果某块业务不具有膨胀的趋势,那策略模式就有点杀鸡用牛刀了。

如果不用策略模式,那如何做到代码的扩展性呢。


public class MultiBizProcessor {

    public void process(String bizType, String bizInfo){

        if (bizType == "1") {
            System.out.println("deal with bizType 1, bizInfo:"+bizInfo);
        } else if (bizType == "2") {
            System.out.println("deal with bizType 2, bizInfo:"+bizInfo);
        } else {
            System.out.println("业务不存在,bizType:" + bizType);
        }
    }

    public static void main(String[] args) {

        MultiBizProcessor multiBizProcessor = new MultiBizProcessor();


        multiBizProcessor.process("1", "处理器输入参数");
        multiBizProcessor.process("2", "处理器输入参数");
        multiBizProcessor.process("3", "处理器输入参数");

    }

}

下面这种风格可以尝试尝试,比策略模式更轻巧的代码架构设计。
这种代码架构模式主要有这几种角色:执行器类型(Consumer、Function、BiFunction等等。),逻辑分发器(指代码中的extensibleProcess方法),执行器的容器(指bizProcessors)。还有就是执行器的装载过程。

public class MultiBizProcessor {

    private static Map<String, Consumer<String>> bizProcessors;

    public MultiBizProcessor(){
        bizProcessors = new HashMap<>();
        bizProcessors.put("1", this::biz1Processor);
        bizProcessors.put("2", this::biz2Processor);

    }

    public  void biz1Processor(String bizInfo){
        System.out.println("deal with bizType 1, bizInfo:"+bizInfo);
    }

    public void biz2Processor(String bizInfo){
        System.out.println("deal with bizType 2, bizInfo:"+bizInfo);
    }

    public void extensibleProcess(String bizType, String bizInfo){
        Optional.ofNullable(bizProcessors.get(bizType))
                .orElseGet(() -> o -> System.out.println("业务不存在,bizType:"+o))
                .accept(bizInfo);
    }
    public static void main(String[] args) {

        MultiBizProcessor multiBizProcessor = new MultiBizProcessor();
        multiBizProcessor.extensibleProcess("1", "处理器输入参数");
        multiBizProcessor.extensibleProcess("2", "处理器输入参数");
        multiBizProcessor.extensibleProcess("3", "处理器输入参数");

    }

}

其实上述这种代码风格还可以借住注解开发的风格做到简化。

查看集合操作示例源码 以及 查看轻量扩展性代码架构设计模式,请在原文末尾获取
原文

正文到此结束
本文目录