番石榴功能组合

时间:2012-01-12 20:39:53

标签: java guava

我看到有一个实用程序可以创建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);
    }

有没有更好的方法将这两个功能组合在一起?

1 个答案:

答案 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

一些解释:

  1. 使用ImmutableList作为返回类型来保证行为(immutablility)。
  2. 返回空的不可变列表,但better than JDK's one
  3. 与2.相同,但这里是单身不可变列表。
  4. 如果您需要可变性,请将ImmutableList.of替换为Lists.newArrayList并保留方法签名。