我最近看到了一个功能技巧,虽然它很简单,但非常有效:用另一个函数“包装”一个函数或一组函数。
下面是我为了展示这个技巧而编写的代码示例。我的示例只为一个命令提供一个函数,但如果需要,它可以很容易地扩展到返回的一堆函数(因此包含可以使用的 Guava Mutlimap 类型)......我返回一个 Optional 所以当一个命令不匹配,它“安全地”返回一个空值;Contact 和 ContacUnit 是域类型,它们都扩展了组织类型......这应该使下面的代码有意义。
package com.xxx.component;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import com.xxx.domain.Contact;
import com.xxx.domain.ContactUnit;
import com.xxx.domain.Organization;
import java.util.Optional;
import java.util.function.Function;
/**
* This serves up the functions used for the domain
* to validate itself.
* Created by beezerbutt on 06/04/2017.
*/
public class MapSetDomainFunctionFactory {
public static final Function<String, Optional<Organization>> toContactFromCwid = s-> Optional.ofNullable(s).map(Contact::new);
public static final Function<String, Optional<Organization>> toContactUnitFromKey = s-> Optional.ofNullable(s).map(ContactUnit::new);
public static final Function<String, Function<String, Optional<Organization>>> commandToFunctions = command -> {
if (command.equalsIgnoreCase("toContactFromCwid")) {
return MapSetDomainFunctionFactory.toContactFromCwid;
} else {
return null;
}
};
}
}
为了让生活更轻松,我包含了 Domain 类代码:
/**
* Created by beezerbutt on 06/04/2017.
*/
public class Contact implements Organization {
}
public class ContactUnit implements Organization {
}
public interface Organization {
}
下面是我运行的 Spock 测试的快照,以证明代码有效: