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();
}
};
你怎么看,我的解决方案。
我担心性能低下。
总之,我的知识又升级了!
多谢。 :)
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();
}
};
你怎么看,我的解决方案。 我担心性能低下。
总之,我的知识又升级了! 多谢。 :)