如何使用 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")
与否。我只是将这两个列表分别设为a
和b
。
【问题讨论】:
能否发布完整的可编译代码? 你的第一个代码 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 个列表 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Java8:HashMap<X, Y> 到 HashMap<X, Z> 使用 Stream / Map-Reduce / Collector