Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 筛选泛型类型的列表_Java_Generics_Guava_Iterable - Fatal编程技术网

Java 筛选泛型类型的列表

Java 筛选泛型类型的列表,java,generics,guava,iterable,Java,Generics,Guava,Iterable,使用guavas可以很容易地筛选列表或列表。此操作执行两项任务:过滤列表并将其转换为给定类型T的序列 然而,我经常在其集合框架中使用IterablesScala语言,它提供了与番石榴相似的功能。我们有选项[T]类,它最多可以被视为单个元素集合。在简单的过滤或转换方法中,有一种方法可以同时执行这两种操作。它期望提供的转换函数返回Option类的值。然后,它将返回的选项对象的内容合并到一个集合中。我认为您可以在Java中实现类似的功能 我在一段时间前就考虑过这个问题,因为首先应用转换,然后过滤需要传

使用guavas可以很容易地筛选列表或列表。此操作执行两项任务:过滤列表并将其转换为给定类型T的序列


然而,我经常在其集合框架中使用
IterablesScala语言,它提供了与番石榴相似的功能。我们有选项[T]类,它最多可以被视为单个元素集合。在简单的过滤或转换方法中,有一种方法可以同时执行这两种操作。它期望提供的转换函数返回Option类的值。然后,它将返回的选项对象的内容合并到一个集合中。我认为您可以在Java中实现类似的功能


我在一段时间前就考虑过这个问题,因为首先应用转换,然后过滤需要传递两次集合。然后有人告诉我,我可以转换和过滤这个集合的迭代器。在这种情况下,将遍历集合一次,您可以根据需要应用尽可能多的过滤器和转换

解决这个问题的一元方法是定义一个将一个iterable转换为iterable的iterable的操作,方法是定义一个转换函数,该函数对于
T
类型的对象返回一个
iterable
类型的对象。然后,可以将每个iterable连接起来,再次形成一个iterable。在Haskell和Scala中,这种映射和连接的组合被称为
concatMap
,我确信它在其他地方还有其他名称

为了实现这一点,我们首先创建一个函数来转换
S,Iterable>castOrNull(类类型){

返回新函数如果
Iterable.filter(…)
返回一个具有扩展功能的Iterable,这样您就可以链接筛选器了。
/*S extends Collection*/Iterable doubles=Iterable.filter(numbers,castOrNull(Double.class)).filter(Predicates.notNull()).filter(Predicates.notEmpty())
为什么要一步完成?转换和过滤是不同的操作。让函数返回一个包含零或一个元素的Iterable是一种非常有趣的方法。我没有想到这一点,如果需要的话,我认为它允许函数返回null是很好的。因为Guava在r10中添加了可选类型(),我想知道我们是否可以使用一个函数我刚刚读了luckyjaca的答案,这似乎是他们在Scala中使用的方法,使用“Option”类型,并增加了flatMap函数的好处。有关更多信息,请参见此答案:“
flatMap
列表[选项[a]
转换为
列表[a]
,任何深入到
选项都将被删除。非常酷。@eneveu:如果
可选
实现
可移植
,那将是非常棒的,但据我所知,没有计划这样做。Nat Pryce的实现可能是Java()是的,但是。我所在公司的一位同事对它进行了改进,你可以看到这个版本。很好。这意味着我们不能使用
Iterables.concat
将所有当前值的
Iterable
展平为
Iterable
。。不过,我想我们可以编写一个实用方法来为我们实现这一点(或者番石榴可以)。另一方面,我会在您的示例中使用
ImmutableSet.of()
来避免每次初始化空的
ArrayList
。类似于
返回包含的instanceof T?ImmutableSet.of(新的S(包含)):ImmutableSet.of()
。最酷的是,空的不可变集是一个隐藏的单例,这避免了不必要的对象/数组实例化。
<T extends Number> Predicate<S<?>> isOfType(Class<N> type) {...}
Iterable<S<?>> numbers;
Iterable<S<?>> filtered = Iterable.filter(numbers, isOfType(Double.class));
Iterable<S<Double>> doubles = (Iterable<S<Double>>) filtered;
<T extends Number> Function<S<?>, S<T>> castOrNull(Class<N> type) {...}

Iterable<S<Double>> doubles = Iterable.filter(numbers, castOrNull(Double.class));
Iterable<S<Double>> doubles = Iterables.filter(doubles, Predicates.notNull());
<I,O> Iterables<O> convert(
    Iterables<O> input, 
    Function<? super I, ? extends O> convert, 
    Predicate<? super O> filter);

<I,O> Iterables<O> convert(
    Iterables<O> input, 
    Function<? super I, ? extends O> convert);
<T extends Number> Function<S<?>, Iterable<S<T>>> castOrNull(Class<T> type) {
    return new Function<S<?>, Iterable<S<T>>> {
        @Override
        public Iterable<S<T>> apply(S<?> s) {
            Object contained = s.get();
            if (!(contained instanceof T)) {
                return ImmutableSet.of();
            }

            return ImmutableSet.of(new S<T>(contained));
        }
    };
}
Iterable<Iterable<S<Double>>> doubleIterables = Iterables.map(numbers, castOrNull(Double.class));
Iterable<S<Double>> doubles = Iterables.concat(doubleIterables);