如何使用 stream().reduce() 基于谓词从一个列表中创建 2 个列表 [重复]

Posted

技术标签:

【中文标题】如何使用 stream().reduce() 基于谓词从一个列表中创建 2 个列表 [重复]【英文标题】:How to create 2 lists from one list based on predicate using stram().reduce() [duplicate] 【发布时间】:2021-09-18 16:44:03 【问题描述】:

我需要使用 stream().reduce() 基于谓词创建 2 个列表。我有一个类似的代码,但它不起作用。

localRequestDTOList.stream().reduce((res, item) ->
       res[predicate(item) ? 'a' : 'b'].push(item);
       return res;
,  a: [], b: [] );

谓词如下所示。

public static Predicate<LocalRequestDTO> payToVendor() 
    return request -> (request.getSuffix().equals("00"));

我想要的是从 localRequestDTOList 创建两个列表,条件是它们的request.getsuffix().equals("00") 与否。我只是将这两个列表分别设为ab

【问题讨论】:

能否发布完整的可编译代码? 你的第一个代码 sn-p 不是有效的 Java 语法,所以它不起作用也就不足为奇了。 【参考方案1】:

您询问了如何使用reduce 对列表进行分区。这就像问如何用螺丝刀敲钉子一样。最好使用正确的方法。

如果你可以使用collect(),那么你可以使用Collectors.partitioningBy()

Map<Boolean, List<LocalRequestDTO>> partition = localRequestDTOList.stream()
    .collect(Collectors.partitioningBy(payToVendor()));
List<LocalRequestDTO> a = partition.get(true);
List<LocalRequestDTO> b = partition.get(false);

【讨论】:

如果您需要拆分为 2 个以上的列表,请改用 groupingBy(...)

以上是关于如何使用 stream().reduce() 基于谓词从一个列表中创建 2 个列表 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

[java]Stream API——reduce

Java Stream Reduce 对象数组

javascript reduce方法用的多么

Stream系列Reduce方法使用

Java8 中reduce的基本使用

Java8:HashMap<X, Y> 到 HashMap<X, Z> 使用 Stream / Map-Reduce / Collector