在不添加新的外部库依赖项的情况下向我们的代码库引入一些收集操作的优点,我们将这些方法添加到我们的实用程序包中。
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); }
所以问题:
编辑添加:我对地图(因而支持转换)的重要论据是 map <由于java.util.Map
的许多用途,/ b>具有显着的语义加载答案 0 :(得分:2)
是否有任何重要的基于集合 我忘记了的功能 包含在库类中?
对于高阶收集函数,我使用Adrian Kuhn在他的文章“Pimp My Foreach”中概述的方法。
其中一些你已经有了,但我想我还是会把它们扔到那里:
答案 1 :(得分:1)
这看起来很不错;我觉得你肯定在这里走上正轨。是的,我认为Mutator是一个好名字;变换更好,因为它更常被读作动词,而地图有一个“名词”的含义,可能会令人困惑;我能想到的唯一一个基于集合的主要功能就是重新排序功能。
答案 2 :(得分:1)
在我使用的类似库中:
aSpecification.isSatisfiedBy(anObject);
答案 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);