当前位置: 首页 > 知识库问答 >
问题:

Java8流:过滤,处理结果,然后处理排除

戴建义
2023-03-14

在Java8的Streams中,我知道如何基于谓词过滤集合,并处理谓词为true的项。我想知道的是,如果谓词仅将集合划分为两个组,那么是否可以通过API基于谓词进行过滤,处理过滤结果,然后立即连接调用以处理过滤器排除的所有元素?

例如,考虑以下列表:

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

是否有可能做到:

intList.stream()
    .filter(lessThanThree -> lessThanThree < 3)
    .forEach(/* process */)
    .exclusions(/* process exclusions */); //<-- obviously sudocode

或者我只需对过滤的项目执行forEach过程,然后调用原始列表上的stream()filter(),然后处理剩余的项目?

谢谢

共有2个答案

李利
2023-03-14

流接口中没有访问排除项的操作。但是,您可以实现更复杂的谓词:

intList.stream()
    .filter(i -> {
        if (i < 3) return true;
        else {
            // Process excluded item i
            return false;
        }
    }).forEach(/* Process included item. */)

但是您必须小心保持谓词不干涉和无状态。

程鸿畅
2023-03-14

请看收集器.partitioningBy,它接收谓词作为参数。您必须使用Stream.collect才能使用它。

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

请注意,Collectors.partitioningBy有一个接受第二个参数的重载版本,如果您希望每个分区被收集到不同于列表的东西,可以使用第二个参数。

在您的示例中,您可以这样使用它:

Map<Boolean, List<Integer>> partition = intList.stream()
    .collect(Collectors.partitioningBy(i -> i < 3));

List<Integer> lessThan = partition.get(true); // [1, 2]
List<Integer> notLessThan = partition.get(false); // [3, 4]

我还想强调一个重要的观察结果,它来自user@Holger在链接问题中添加的评论:

collector.partitioning by将始终在映射中为truefalse生成一个结果,即如果没有元素落入该组,而不是null,则为空列表。

这种特殊性作为API注释添加到jdk9文档中(同样,user@Holger也注意到了这一点):

如果一个分区没有元素,它在结果映射中的值将是一个空列表。

 类似资料:
  • 以下代码正在为空的属性抛出NPE。class Person有属性:string:name,Integer:age,Integer:salary此处可以为空。我想创建一个工资列表。 在这里,我必须在结果列表中保留空值。null不能替换为0。

  • 我正在使用Kafka Streams API (KTable,GlobalKTable..).我在用KStreams消费Kafka主题。我需要根据一些配置过滤出一些传入的Kafka事件,并在配置发生变化时处理它们。主题的持续时间限制至少为7天。以下是要求: 键值状态 K1 V1加工 K2 V2 未处理(基于某些业务逻辑) K3 V3 已处理 K4 V4加工 K1 V5加工 ------ 现在我想再

  • QueryList返回的集合数据均为Collection集合对象而非普通数组,目的就是为了方便处理采集结果数据。 QueryList引入了Laravel中Collection集合对象,它提供了一个更具可读性的、更便于处理数组数据的封装。下面通过几个例子来说明它的用法,更多用法可以去查看Laravel文档。 Collection文档:https://d.laravel-china.org/docs/

  • 例如,如果我有如下代码: 我想弄清楚如何删除条件块,并在一个流中这样做。 如果我只是在筛选结果上调用“.map”,如果它找到了匹配的条目,这就可以工作。如果不是,我会得到一个NoSuchelementException。 您能想出一种方法在流中包含第一个条件而不使其变得更加复杂吗?

  • 在Controller/JAX-RSendpoint处理请求后,如何执行Spring Security过滤器? 当请求被双向处理时,一个普通的java过滤器链应该得到控制。如何使用Spring Security过滤器实现这一点?我试着给chain打电话。doFilter()开始,并在调用后添加我的逻辑。但是,在处理请求后,控件不会返回。 关于如何实现这一点,有什么建议吗?是否有可能使用Spring

  • Result 是 Option 类型的更丰富的版本,描述的是可能的错误而不是可能的不存在。 也就是说,Result<T,E> 可以有两个结果的其中一个: Ok<T>:找到 T 元素 Err<E>:发现错误,使用元素 E 表示(An error was found with element E) 按照约定,预期结果是 “Ok”,而意外结果是 “Err”。 和 Option 类似,Result 也有很