有一种方法可以构成与当前方法参考相反的方法参考。请参见下面的@vlasec答案,该答案显示了如何通过将方法引用显式转换为a Predicate
,然后使用该negate
函数进行转换来实现。这是其他一些不太麻烦的方法之一。
相反的:
Stream<String> s = ...;
int emptyStrings = s.filter(String::isEmpty).count();
这是:
Stream<String> s = ...;
int notEmptyStrings = s.filter(((Predicate<String>) String::isEmpty).negate()).count()
或这个:
Stream<String> s = ...;
int notEmptyStrings = s.filter( it -> !it.isEmpty() ).count();
就我个人而言,我更喜欢后一种技术,因为我发现它it -> !it.isEmpty()
比冗长而冗长的显式强制转换然后取反更清晰。
一个人也可以做一个谓词并重用它:
Predicate<String> notEmpty = (String it) -> !it.isEmpty();
Stream<String> s = ...;
int notEmptyStrings = s.filter(notEmpty).count();
或者,如果有一个集合或数组,则只需使用一个简单的for循环,其开销较小,并且*可能会**更快:
int notEmpty = 0;
for(String s : list) if(!s.isEmpty()) notEmpty++;
*如果您想知道什么更快,请使用JMH http://openjdk.java.net/projects/code-tools/jmh,并避免使用手工基准测试代码,除非它避免了所有JVM优化-请参阅Java 8:Streams的性能vs收藏
**我因暗示for循环技术更快而感到惊讶。它消除了流的创建,消除了使用另一个方法调用(谓词的负函数),并且消除了临时累加器列表/计数器。因此,最后一个构造保存的一些内容可能会使它更快。
我确实认为它更简单,更好,即使不是更快。如果工作需要锤子和钉子,请不要带电锯和胶水!我知道有些人对此表示怀疑。
wish-list:Stream
随着Java用户更加熟悉Java 功能,我希望Java 功能有所发展。例如,Stream中的'count'方法可以接受a,Predicate
以便可以像这样直接完成:
Stream<String> s = ...;
int notEmptyStrings = s.count(it -> !it.isEmpty());
or
List<String> list = ...;
int notEmptyStrings = lists.count(it -> !it.isEmpty());
Predicate.not(Predicate)
方法的添加。但是这个问题仍然存在,因此我们最早会在Java 12中看到它(如果有的话)。