在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()
,然后处理剩余的项目?
谢谢
流接口中没有访问排除项的操作。但是,您可以实现更复杂的谓词:
intList.stream()
.filter(i -> {
if (i < 3) return true;
else {
// Process excluded item i
return false;
}
}).forEach(/* Process included item. */)
但是您必须小心保持谓词不干涉和无状态。
请看收集器.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
将始终在映射
中为true
和false
生成一个结果,即如果没有元素落入该组,而不是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 也有很