java过滤器排除_Java 8 Stream:过滤,处理结果,然后处理排除项

在Java 8的Streams中,我知道如何基于谓词过滤集合,并处理谓词为真的项目。 我想知道的是,如果谓词将集合分为两类,是否可以通过API根据谓词进行过滤,处理过滤后的结果,然后立即链接到调用以处理过滤器排除的所有元素?

例如,考虑以下列表:

List intList = Arrays.asList(1,2,3,4);

是否可以这样做:

intList.stream()

.filter(lessThanThree -> lessThanThree < 3)

.forEach(/* process */)

.exclusions(/* process exclusions */); //

还是我只需要对过滤后的项目执行forEach处理,然后在原始列表上调用stream()和filter()来处理其余项目?

谢谢!

stackoverflow.com/q/43766534/2711488

看一下Collectors.partitioningBy,它接收一个谓词作为参数。您必须使用Stream.collect才能使用它。

结果是只有两个Boolean条目的映射:对于true键,您具有List,其中包含与谓词匹配的流元素,而对于false键,您具有包含不匹配的元素。

请注意,Collectors.partitioningBy具有一个接受第二个参数的重载版本,这是下游收集器,如果您希望将每个分区收集到不同于列表的内容,则可以使用该收集器。

在您的示例中,您可以通过以下方式使用它:

Map> partition = intList.stream()

.collect(Collectors.partitioningBy(i -> i < 3));

List lessThan = partition.get(true); // [1, 2]

List notLessThan = partition.get(false); // [3, 4]

我还要强调一个重要的观察,取自用户@Holger在链接的问题中添加的评论:

Collectors.partitioningBy will always have a result for true and false in the Map, i.e. an empty list if no element fell into that group, rather than null.

此特殊性已作为API说明添加到jdk9文档中(同样,用户@Holger观察到了这一点):

If a partition has no elements, its value in the result Map will be an empty List.

您可以从以下网址获取示例:concretepage.com/java/jdk-8/

Stream界面中没有用于访问排除项目的操作。但是,您可以实现更复杂的谓词:

intList.stream()

.filter(i -> {

if (i < 3) return true;

else {

// Process excluded item i

return false;

}

}).forEach(/* Process included item. */)

但是您必须小心,使谓词保持无干扰且无状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值