Fan*_*Fan 3 java parallel-processing java-8 java-stream
我有一段这样的代码:
List<Egg> eggs = hens.parallelStream().map(hen -> {
ArrayList<Egg> eggs = new ArrayList<>();
while (hen.hasEgg()) {
eggs.add(hen.getEgg());
}
return eggs;
}).flatMap(Collection::stream).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但是通过这种方式,我必须为每只母鸡创建一个ArrayList,并且在母鸡100%处理之前不会收集鸡蛋.我想要这样的东西:
List<Egg> eggs = hens.parallelStream().map(hen -> {
while (hen.hasEgg()) {
yield return hen.getEgg();
}
}).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但Java没有收益率.有没有办法实现它?
您的Hen课程很难适应Stream API.如果您无法更改它并且没有其他有用的方法(例如Collection<Egg> getAllEggs()或Iterator<Egg> eggIterator()),您可以创建如下的蛋流:
public static Stream<Egg> eggs(Hen hen) {
Iterator<Egg> it = new Iterator<Egg>() {
@Override
public boolean hasNext() {
return hen.hasEgg();
}
@Override
public Egg next() {
return hen.getEgg();
}
};
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, 0), false);
}
Run Code Online (Sandbox Code Playgroud)
现在您可以通过以下方式使用它:
List<Egg> eggs = hens.parallelStream()
.flatMap(hen -> eggs(hen))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
当然,Stream如果您可以更改课程,则可以实现更好的实施Hen.