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

如何使用stram().reduce()[duplicate]从一个基于谓词的列表创建两个列表

欧阳嘉年
2023-03-14

我需要使用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"));
}

共有1个答案

孙思源
2023-03-14

您询问了如何使用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);
 类似资料:
  • 我有一个数据框架,我想从其中一列的列表中创建5列 示例: 请注意,这里很少有列表少于5列,对于这些列,请在该位置插入NAN。

  • 我试图建立一个专栏,将根据另一个。新列应反映满足某些标准的值,并在值不符合标准的地方放置0。 例如,名为银行余额的列将有负值和正值;新列透支将为相应行提供负值,余额大于0时为0。 最终结果应该是这样的。

  • 问题内容: 我有以下Java6和Java8代码: Java8中有什么方法可以使用Lambda以更简洁的方式处理前一个问题? 问题答案: 流绑定到给定的可迭代/集合,因此您不能真正地“并行”迭代两个集合。 一种解决方法是创建索引流,但不一定比for循环有所改进。流版本可能如下所示:

  • 问题内容: 我有看起来像的数据框: 为了进一步处理数据,我需要拆分该列,然后将其替换为如下所示的多列: 因此,这些列可以追加到初始数据帧。我不知道该怎么做,因为像 不能解决我的问题,因为我不仅需要基于列表中位置的列,还需要基于列表中每个唯一值的列。您知道我该如何处理吗? 问题答案: 您可以使用和: 如果需要计数值,则可以使用(我添加一个字符串进行测试):

  • 我有两个具有相同列的表,这些表没有唯一的列。假设列为Col1、Col2、Col3和Col4。表是T1和T2。 我要做的是插入从T2到T1的所有行,其中Col1 比如Col1=“APPLE”和Col2=“2019”。如果一行在T2中包含Col1=“APPLE”和Col2=2019,我不想将其插入T1,而如果一行包含Col1=“APPLE”和Col2=2020,我想将其插入T1。 我正在努力找到最简单

  • 基本上,我有一个规范,以便过滤一个查询。在它的内部,需要添加一个新的谓词。 想象一个带有jsonb列(bar)的表(Z)。该列具有以下结构: 通过这样做: 有什么建议吗?