我正在更改一些旧代码以利用Java 8的功能方面。特别是,我正在使用Guava谓词转到java.util.function.Predicate
。其中一个谓词是检查Stream
是否是同质的,即由所有相同的元素组成。
在我的旧代码中(使用Guava' s Predicate
),我有了这个:
static <T> Predicate<Iterable<T>> isHomogeneous() {
return new Predicate<Iterable<T>>() {
public boolean apply(Iterable<T> iterable) {
return Sets.newHashSet(iterable).size() == 1;
}
};
}
这是新版本,使用java.util.function.Predicate
:
public static Predicate<Stream<?>> isHomogeneous =
stream -> stream.collect(Collectors.toSet()).size() == 1;
IDE(IntellijIDEA v.12)没有显示任何红色波浪线表示错误,但是当我尝试编译时,我得到了这个:
java: no suitable method found for
collect(java.util.stream.Collector<java.lang.Object,capture#1 of ?,java.util.Set<java.lang.Object>>)
method java.util.stream.Stream.<R>collect(java.util.function.Supplier<R>,java.util.function.BiConsumer<R,? super capture#2 of ?>,java.util.function.BiConsumer<R,R>) is not applicable
(cannot infer type-variable(s) R
(actual and formal argument lists differ in length))
method java.util.stream.Stream.<R,A>collect(java.util.stream.Collector<? super capture#2 of ?,A,R>) is not applicable
(cannot infer type-variable(s) R,A,capture#3 of ?,T
(argument mismatch; java.util.stream.Collector<capture#2 of ?,capture#4 of ?,java.util.Set<capture#2 of ?>> cannot be converted to java.util.stream.Collector<? super capture#2 of ?,capture#4 of ?,java.util.Set<capture#2 of ?>>))
注意:我认为在流上设置谓词可能不是一个好主意。事实上,在我的代码库中,我只需要List<>
。但我仍然对简单的单行isHomogeneous
谓词有什么问题感到好奇。
答案 0 :(得分:13)
另一种选择是使用Stream.distinct
并确保在结果流中只获得1个元素。
stream.distinct().limit(2).count() == 1
答案 1 :(得分:-1)
您可能想要做的是使用方法参考,如
static <T> boolean isHomogeneous(Iterable<T> iterable) {
return Sets.newHashSet(iterable).size() == 1;
}
然后你可以像那样使用它
Iterable<Integer> iterable1 = Lists.newArrayList(1, 1);
Iterable<Integer> iterable2 = Lists.newArrayList(1, 2);
Stream.of(iterable1, iterable2).filter(YourClass::isHomogeneous).collect(Collectors.toList());