内容简介:在本快速教程中,我们将讨论在Java 8中谓词链Predicates的不同方法。让我们看看如何使用简单的谓词来过滤名称列表:在这个例子中,我们过滤了名称列表,只使用谓词保留以“A”开头的名称 :
在本快速教程中,我们将讨论在 Java 8中谓词链Predicates的不同方法。
让我们看看如何使用简单的谓词来过滤名称列表:
@Test
<b>public</b> <b>void</b> whenFilterList_thenSuccess(){
List<String> names = Arrays.asList(<font>"Adam"</font><font>, </font><font>"Alexander"</font><font>, </font><font>"John"</font><font>, </font><font>"Tom"</font><font>);
List<String> result = names.stream()
.filter(name -> name.startsWith(</font><font>"A"</font><font>))
.collect(Collectors.toList());
assertEquals(2, result.size());
assertThat(result, contains(</font><font>"Adam"</font><font>,</font><font>"Alexander"</font><font>));
}
</font>
在这个例子中,我们过滤了名称列表,只使用谓词保留以“A”开头的名称 :
name -> name.startsWith("A")
但是,如果我们想要应用多个谓词呢?
多个过滤器
如果我们想要应用多个谓词,一个选项是简单地链接多个过滤器:
@Test
<b>public</b> <b>void</b> whenFilterListWithMultipleFilters_thenSuccess(){
List<String> result = names.stream()
.filter(name -> name.startsWith(<font>"A"</font><font>))
.filter(name -> name.length() < 5)
.collect(Collectors.toList());
assertEquals(1, result.size());
assertThat(result, contains(</font><font>"Adam"</font><font>));
}
</font>
复杂的谓词
我们可以使用一个带有复杂谓词的过滤器,而不是使用多个过滤器:
@Test
<b>public</b> <b>void</b> whenFilterListWithComplexPredicate_thenSuccess(){
List<String> result = names.stream()
.filter(name -> name.startsWith(<font>"A"</font><font>) && name.length() < 5)
.collect(Collectors.toList());
assertEquals(1, result.size());
assertThat(result, contains(</font><font>"Adam"</font><font>));
}
</font>
这个选项比第一个选项更灵活,因为我们可以使用按位运算来构建我们想要的复杂谓词。
.结合 谓词
如果我们不想使用按位运算构建复杂的谓词,Java 8 Predicate可以使用有用的方法来组合谓词。
我们将使用Predicate.and(),Predicate.or()和Predicate.negate()方法组合谓词。
我们将明确定义我们的谓词,然后我们将使用Predicate.and()组合它们 :
@Test
<b>public</b> <b>void</b> whenFilterListWithCombinedPredicatesUsingAnd_thenSuccess(){
Predicate<String> predicate1 = str -> str.startsWith(<font>"A"</font><font>);
Predicate<String> predicate2 = str -> str.length() < 5;
List<String> result = names.stream()
.filter(predicate1.and(predicate2))
.collect(Collectors.toList());
assertEquals(1, result.size());
assertThat(result, contains(</font><font>"Adam"</font><font>));
}
</font>
我们可以看到,语法非常直观,方法名称表明了操作的类型,
我们也可以使用 Predicate.or()来组合Predicates。
让我们提取名称以“J”开头,以及长度小于4的名称:
@Test
<b>public</b> <b>void</b> whenFilterListWithCombinedPredicatesUsingOr_thenSuccess(){
Predicate<String> predicate1 = str -> str.startsWith(<font>"J"</font><font>);
Predicate<String> predicate2 = str -> str.length() < 4;
List<String> result = names.stream()
.filter(predicate1.or(predicate2))
.collect(Collectors.toList());
assertEquals(2, result.size());
assertThat(result, contains(</font><font>"John"</font><font>,</font><font>"Tom"</font><font>));
}
</font>
在组合我们的Predicates时我们也可以使用Predicate.negate():
@Test
<b>public</b> <b>void</b> whenFilterListWithCombinedPredicatesUsingOrAndNegate_thenSuccess(){
Predicate<String> predicate1 = str -> str.startsWith(<font>"J"</font><font>);
Predicate<String> predicate2 = str -> str.length() < 4;
List<String> result = names.stream()
.filter(predicate1.or(predicate2.negate()))
.collect(Collectors.toList());
assertEquals(3, result.size());
assertThat(result, contains(</font><font>"Adam"</font><font>,</font><font>"Alexander"</font><font>,</font><font>"John"</font><font>));
}
</font>
在这里,我们使用or()和negate()的组合来按名称以“J”开头或长度不小于4 来过滤List。
结合谓词内联
我们不需要明确定义 Predicates要使用and(), or(), 和negate().
可以通过强制Cast谓词来内联它们 :
@Test
<b>public</b> <b>void</b> whenFilterListWithCombinedPredicatesInline_thenSuccess(){
List<String> result = names.stream()
.filter(((Predicate<String>)name -> name.startsWith(<font>"A"</font><font>))
.and(name -> name.length()<5))
.collect(Collectors.toList());
assertEquals(1, result.size());
assertThat(result, contains(</font><font>"Adam"</font><font>));
}
</font>
结合一组谓词
最后,让我们看看如何通过Reducing合并它们来链接一组Predicates。
在下面的例子中,我们有一个列表的谓词,我们使用组合Predicate.and():
@Test
<b>public</b> <b>void</b> whenFilterListWithCollectionOfPredicatesUsingAnd_thenSuccess(){
List<Predicate<String>> allPredicates = <b>new</b> ArrayList<Predicate<String>>();
allPredicates.add(str -> str.startsWith(<font>"A"</font><font>));
allPredicates.add(str -> str.contains(</font><font>"d"</font><font>));
allPredicates.add(str -> str.length() > 4);
List<String> result = names.stream()
.filter(allPredicates.stream().reduce(x-><b>true</b>, Predicate::and))
.collect(Collectors.toList());
assertEquals(1, result.size());
assertThat(result, contains(</font><font>"Alexander"</font><font>));
}
</font>
请注意:x->true 标识
如果我们想要使用Predicate.or()组合它们会有所不同:
@Test
<b>public</b> <b>void</b> whenFilterListWithCollectionOfPredicatesUsingOr_thenSuccess(){
List<String> result = names.stream()
.filter(allPredicates.stream().reduce(x->false, Predicate::or))
.collect(Collectors.toList());
assertEquals(2, result.size());
assertThat(result, contains(<font>"Adam"</font><font>,</font><font>"Alexander"</font><font>));
}
</font>
完整的源代码可以 在GitHub上获得
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- java8-谓词(predicate)
- 在 TS 中如何实现类型保护?类型谓词了解一下
- 在 TS 中如何实现类型保护?类型谓词了解一下
- 【大数据】SparkSql连接查询中的谓词下推处理(一) 原 荐
- 【大数据 】SparkSQL连接查询中的谓词下推处理(二) 原 荐
- Spark SQL 源码剖析 PushDownPredicate:谓词不是想下推,想推就能推
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
大型网站系统与Java中间件开发实践
曾宪杰 / 电子工业出版社 / 2014-4-24 / 65.00
本书围绕大型网站和支撑大型网站架构的 Java 中间件的实践展开介绍。从分布式系统的知识切入,让读者对分布式系统有基本的了解;然后介绍大型网站随着数据量、访问量增长而发生的架构变迁;接着讲述构建 Java 中间件的相关知识;之后的几章都是根据笔者的经验来介绍支撑大型网站架构的 Java 中间件系统的设计和实践。希望读者通过本书可以了解大型网站架构变迁过程中的较为通用的问题和解法,并了解构建支撑大型......一起来看看 《大型网站系统与Java中间件开发实践》 这本书的介绍吧!
CSS 压缩/解压工具
在线压缩/解压 CSS 代码
HSV CMYK 转换工具
HSV CMYK互换工具