我看到有一个实用程序可以创建Function<A,C>
,它由Function<A,B>
和Function<B,C>
组成
我有类似但有点不同的情况。
我的第一个函数是valueOfFunction
,它根据我BO
类中的键返回枚举。
secind函数使用参数调用Enum上的方法,该参数是BO
对象。
所以它并不完全是A->B->C
这是功能:
private final static class RequestConvertor implements Function<CoreData, List<Request>> {
private final static Function<String,RequestConvertorEnum> typeConvertor = valueOfFunction(RequestConvertorEnum.class);
@Override
public List<Request> apply(CoreData coreData) {
RequestConvertorEnum requestConvertorEnum = typeConvertor.apply(coreData.getType());
return requestConvertorEnum.convertToRequests(coreData);
}
}
以下是枚举的方法:
private final List<Request> convertToRequests(CoreData coreData) {
List<PropertyWrapper> properties = getProperties(coreData);
if (properties.size() == 0) {
return Collections.emptyList();
}
Request request = new Request(coreData.getKey(), properties, new RequestMetaData(
coreData.getFoo()));
return newArrayList(request);
}
有没有更好的方法将这两个功能组合在一起?
答案 0 :(得分:1)
我认为valueOfFunction
的使用首先是不合适的 - 您在另一个函数(它是private static
成员)中使用仅立即调用apply
方法。您应该使用旧的Enum.valueOf(String)
静态方法:
private final static class RequestConvertor
implements Function<CoreData, List<Request>> {
@Override
public List<Request> apply(CoreData coreData) {
return RequestConvertorEnum.valueOf(coreData.getType())
.convertToRequests(coreData);
}
}
请注意,提供不代表任何枚举值的String会引发IllegalArgumentException
,但是在您的当前代码中,您在运行时(Enums.valueOfFunction returns null if the Enum constant does not exist)可能有NullPointerException
,我想你是意识到它(如果你不是,你现在:)。)。
此外,关于其余代码的建议很少。如果您不需要可变性,请使用ImmutableLists而不是ArrayLists(我假设您不修改结果,因为Collections.emptyList
本身是不可变的,因此如果您将修改{{1的结果,它将在运行时失败方法)。
convertToRequests
一些解释:
如果您需要可变性,请将ImmutableList.of替换为Lists.newArrayList并保留方法签名。