为清晰起见,命名集合扩展

时间:2009-05-27 17:21:23

标签: java generics collections coding-style

在不添加新的外部库依赖项的情况下向我们的代码库引入一些收集操作的优点,我们将这些方法添加到我们的实用程序包中。

static public List<T> filter(List<T> source, Predicate<T> filter);
static <Y,T> public List<Y> transform(List<T> source, Mutator<Y,T> filter);
static public boolean exists(List<T> source, Predicate<T> filter);
static public T findFirst(List<T> source, Predicate<T> filter);
static public boolean trueForAll(List<T> source, Predicate<T> filter);

使用话务员接口

public interface Predicate<T> { public boolean apply(T item); }
public interface Mutator<T,Y> { public Y apply(T item); }

所以问题:

  • 过滤器是包含扩展名的类的好名字吗?如果不是,那么更好吗?
  • Mutator&lt; T,Y&gt;适当命名?
  • 我应该更喜欢地图转换改为过滤器?< / li>
  • 是否有任何重要的基于集合的函数我忘记包含在库类中?

编辑添加:我对地图(因而支持转换)的重要论据是 map <由于java.util.Map

的许多用途,/ b>具有显着的语义加载

6 个答案:

答案 0 :(得分:2)

  

是否有任何重要的基于集合   我忘记了的功能   包含在库类中?

对于高阶收集函数,我使用Adrian Kuhn在他的文章“Pimp My Foreach”中概述的方法。

其中一些你已经有了,但我想我还是会把它们扔到那里:

  • AllSatisfy
  • AnySatisfy
  • 基数
  • 收集
  • 计数
  • CutPieces
  • 检测
  • 折叠
  • GroupedBy
  • 的IndexOf
  • 进样
  • 拒绝
  • 选择

答案 1 :(得分:1)

这看起来很不错;我觉得你肯定在这里走上正轨。是的,我认为Mutator是一个好名字;变换更好,因为它更常被读作动词,而地图有一个“名词”的含义,可能会令人困惑;我能想到的唯一一个基于集合的主要功能就是重新排序功能。

答案 2 :(得分:1)

在我使用的类似库中:

  • 规范代替谓词aSpecification.isSatisfiedBy(anObject);
  • Mapper 代替 Mutator
  • 地图 收集适用于小型商户(转换适用于您的情况)
  • 注入为小型人
  • 过滤器 选择用于小型商品

答案 3 :(得分:1)

我称之为地图过滤。 Reduce对我来说意义略有不同,变换太模糊了。至于班级名称,过滤器可能不是最好的,但我没有更好的推荐。

我知道你没有具体要求这个,但是通用方法中的一些签名可以改进:

 static public <T> List<T> filter(List<T> source, Predicate<? super T> filter);
 static public <Y,T> List<Y> transform(List<T> source, Mutator<Y,? super T> filter);
 static public <T> boolean exists(List<T> source, Predicate<? super T> filter);
 static public <T> T findFirst(List<T> source, Predicate<? super T> filter);
 static public <T> boolean trueForAll(List<T> source, Predicate<? super T> filter);

答案 4 :(得分:0)

这不是你提出的问题,但这符合你的问题。对我来说,更好的说法是:

List<String> shortWords = filtered(allWords, short);

大于

List<String> shortWords = filter(allWords, short);

我会坚持使用转换过滤器

答案 5 :(得分:0)

为了保持一致,似乎Transform应该是Mutate(或者Mutator应该是Transformer)。这似乎相当清楚意图:

static <Y,T> public List<Y> mutate (List<T> originalForm, Mutator<Y,T> mutator);

规范也更加冗长(但更加一致和传统):

static public boolean isTrueForAll(List<T> source, Predicate<T> filter);

static public boolean assertTrueForAll(List<T> source, Predicate<T> filter);