gpt4 book ai didi

java根据变量收集流和分组

转载 作者:太空宇宙 更新时间:2023-11-04 10:45:41 24 4
gpt4 key购买 nike

我得到了这两个类“Transaction”,它们具有 Trader trader、intyear、int value、long seq 属性,而“Trader”则具有属性 String name、String city。

仅当 seq = seq + 1 时,我才需要对该流进行分组和求和:

    Trader raoul = new Trader("Raoul", "Cambridge");
Trader mario = new Trader("Mario","Milan");
Trader alan = new Trader("Alan","Cambridge");
Trader brian = new Trader("Brian","Cambridge");

List<Transaction> transactions = Arrays.asList(
new Transaction(brian, 2012, 300, 1),
new Transaction(raoul, 2012, 1000, 2),
new Transaction(raoul, 2012, 400, 13),
new Transaction(mario, 2012, 710, 14),
new Transaction(mario, 2012, 700, 94),
new Transaction(alan, 2012, 950, 95)
);

我怎样才能实现这个目标:

{Trader:Brian in Cambridge, year: 2012, value:1300, seq:1}, {Trader:Raoul in Cambridge, year: 2012, value:1110, seq:13}, {Trader:Mario in Milan, year: 2012, value:1650, seq:94}

请帮忙!

最佳答案

示例解决方案:

Stream.concat(
transactions.stream()
.collect(Collectors.groupingBy(transaction -> transaction.seq / 2 ))
.entrySet().stream(),

transactions.stream()
.collect(Collectors.groupingBy(transaction -> (transaction.seq + 1) / 2))
.entrySet().stream()

)
.filter(elem -> elem.getValue().size() == 2)
.map(entry -> entry.getValue().stream().reduce((left, right) -> new Transaction(left.trader, left.year, left.value + right.value, Long.min(left.seq, right.seq))).get())
.collect(Collectors.toList())

上面的代码:

  1. 根据交易的 seq 编号除以 2 对交易进行分组(因为在您的示例中,一对交易的序列可能同时以偶数和奇数开头,因此我们需要执行两次,一次将除法结果向上舍入,一次向下舍入)
  2. 过滤掉不匹配的值(与上述两个映射中的连续交易不匹配的值)
  3. 将结果连接到单个流中,丢弃映射键
  4. 将交易对映射到表示原始交易聚合状态的单个交易

请注意,如果交易对的序列始终以奇数开头,则上述情况可以进一步简化

关于java根据变量收集流和分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48447767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com