return java 可以将 groupingby 流式传输到这个数组变量吗?

can return java stream groupingby to this's array variable?

Q.1) 你好,javastream的groupingby可以让自己的数组可变吗?

这是实体

public class Test {
   private int id;
   private int itemId;
   private int[] itemIds;
   private boolean filter;
}

这是测试列表样本

{
   test(id=1, itemId=1)
   test(id=1, itemId=2)
   test(id=1, itemId=3)
   test(id=2, itemId=5)
   test(id=2, itemId=11)
}

我想按 test.id 分组,例如

{
   test(id=1, itemIds=[1,2,3])
   test(id=2, itemIds=[5,11])
}

我该怎么办?

tests.stream().collect(Collectors.groupingBy(Test::getId), ?, ?);

Q.2) 如何合并两个流代码?

tests.stream().filter(Test::isFilter).anyMatch(t -> {throw new Exception;});
tests.stream().collect(Collectors.groupingBy(Test::getId, ?, ?); // Q1 result

关于这个..?

tests.stream().filter(Test::isFilter).anyMatch(t -> {throw new Exception;}).collect(Collectors.groupingBy(Test::getId, ?, ?);

Q3) Q1上面,Q2的stream代码比java 'for'语法性能好?

提前谢谢你。 :)

对于分组假设一个像 Test(int id, int itemId, int[] itemIds) 这样的构造函数和像 id()itemId()itemIds() 这样的流利的 getter,你可以这样展开你的数据:

List<Test> unflattenedTests = tests.stream()
   .collect(Collectors.groupingBy(Test::id))
   .entrySet().stream().map(e -> new Test(
       e.getKey().intValue(),
       0,
       e.getValue().stream().mapToInt(Test::itemId).toArray()
    ))
    .collect(Collectors.toList());

至于在单个语句中合并过滤器和抛出逻辑,除了 peek 我真的想不出任何其他方法,例如:

List<Test> unflattenedTests = tests.stream()
   .peek(t -> { if (t.isFilter()) throw new RuntimeException(); })
   .collect(...

@plalx感谢回答!

感谢回答,这是我的解决方案

tests.stream()
    .peek(t -> {if (Test::isFilter) throw new Exception();})
    .collect(Collectors.groupingBy(Test::getId, Collectors.mapping(Test::getItemId, Collectors.toSet())))
    .forEach((id, itemIdSet) -> {
        if (!somBusiness(id, itemIdSet)) {
            throw new Exception();
        }
    };

你怎么看,我的解决方案。 我担心性能低下。

总之,我的知识又升级了! 多谢。 :)