我看到有一个创建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);
}有没有更好的方法将这两个函数组合在一起?
发布于 2012-01-13 06:28:35
我认为valueOfFunction的用法首先是不合适的--你只能在另一个调用apply方法的函数(它是private static成员)中的中使用它。你应该使用老的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);
}
}请注意,提供不表示任何枚举值的字符串将抛出IllegalArgumentException,但在您当前的代码中,您可能会在运行时(Enums.valueOfFunction returns null if the Enum constant does not exist)抛出NullPointerException,我想您已经意识到了这一点(如果您没有意识到这一点,那么您现在就是:)。
此外,关于其余代码的建议很少。如果您不需要可变性,请使用ImmutableLists而不是ArrayLists (我假设您不会修改result,因为Collections.emptyList本身是不可变的,所以如果您要修改convertToRequests方法的result,那么它将在运行时失败)。
private final ImmutableList<Request> convertToRequests(CoreData coreData) { // 1.
List<PropertyWrapper> properties = getProperties(coreData);
if (properties.size() == 0) {
return ImmutableList.of(); // 2.
}
Request request = new Request(coreData.getKey(), properties,
new RequestMetaData(coreData.getFoo()));
return ImmutableList.of(request); // 3.
}以下是一些解释:
如果你需要可变性,用Lists.newArrayList替换ImmutableList.of,并保持方法签名不变。
https://stackoverflow.com/questions/8841959
复制相似问题