2012-07-26 24 views
2

我想知道在使用Guava方法时是否可以丢弃一些值。在使用Maps.uniqueIndex和Guava时拒绝值

public static Function<Locale, String> GET_LANGUAGE = new Function<Locale, String>() { 
    @Override 
    public String apply(Locale input) { 
     return StringUtils.isBlank(input.getLanguage()) ? "NO_LANGUAGE" : input.getLanguage(); 
    } 
}; 

Maps.uniqueIndex(availableLocales, GET_LANGUAGE); 

我知道我可以使用多重映射,因为许多地方可以有相同的语言,但它实际上符合我的需求。

例如,我希望没有任何语言的语言环境不在输出映射中。因为我不能返回null或类似的东西,所以我将带有不相关语言的语言环境重定向到键“NO_LANGUAGE”。问题是该值仍然可以检索。

是否有某种“/ dev/null”映射键,或者我总是需要在使用谓词之前/之后做一些过滤?

回答

7

番石榴贡献者在这里。

没有。做一个过滤器......或者可能更有效率,只需自己构建地图,并且完全不使用Maps.uniqueIndex。无论如何,这可能更简单和更短。

+0

yeeees我知道但我喜欢番石榴:) – 2012-07-26 10:05:48

+0

我很高兴你这么做 - 我在一个月内开始全职工作于番石榴 - 但番石榴不能真正将Java变成一种语言,函数式编程在一般情况下是一种理智的方法。 – 2012-07-26 10:12:21

+0

这就是为什么我要学习Scala。痛苦是匿名内部类的冗长,但一旦创建类就可以了。查看我的代码http://pastebin.com/KNe5LxAP最后,Scala提供了与Option getOrElse相同的功能。那么在Guava呢? – 2012-07-26 10:55:36

3

我想补充一点,如果this issue得到解决,你就可以做到:

ImmutableMap<String, Locale> index = FluentIterable.from(availableLocales) 
    .filter(NOT_BLANK_LANGUAGE) 
    .uniqueIndex(GET_LANGUAGE); 

public static Predicate<Locale> NOT_BLANK_LANGUAGE = new Predicate<Locale>() { 
    @Override 
    public boolean apply(Locale input) { 
    return !StringUtils.isBlank(input.getLanguage()); 
    } 
}; 

public static Function<Locale, String> GET_LANGUAGE = new Function<Locale, String>() { 
    @Override 
    public String apply(Locale input) { 
    return input.getLanguage(); 
    } 
}; 

其中,与Java 8 Lambda表达式,将更加简洁。

+0

实际上我想知道的是如果我可以在不创建谓词的情况下做到这一点。最后这是我所做的 – 2012-07-26 10:56:32