首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Guava函数组合

Guava函数组合
EN

Stack Overflow用户
提问于 2012-01-13 04:39:53
回答 1查看 1.5K关注 0票数 1

我看到有一个创建Function<A,C>的实用程序,它是Function<A,B>Function<B,C>的组合

我有一个类似的案例,但有一点不同。

我的第一个函数是valueOfFunction,它根据BO类中的键返回枚举。

secind函数使用一个参数调用Enum上的方法,该参数是BO对象。

所以它并不完全是A->B->C

下面是函数:

代码语言:javascript
复制
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);
    }

}

下面是枚举的方法:

代码语言:javascript
复制
   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);
    }

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-13 06:28:35

我认为valueOfFunction的用法首先是不合适的--你只能在另一个调用apply方法的函数(它是private static成员)中的中使用它。你应该使用老的Enum.valueOf(String)静态方法:

代码语言:javascript
复制
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,那么它将在运行时失败)。

代码语言:javascript
复制
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.
}

以下是一些解释:

  1. 使用ImmutableList作为返回类型,以保证行为为空的不可变表,但
    1. 为2.但此处的单例不可变表。

如果你需要可变性,用Lists.newArrayList替换ImmutableList.of,并保持方法签名不变。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8841959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档