我有一个物体列表,比如说形状。我想使用流处理它们,并根据列表中的内容返回另一个对象shapetype。
通常我只返回shapetype.generic,但是如果其中有一个矩形,我想返回shapetype.rect。如果列表中有六边形,我想返回shapetype.hexa。当矩形和正方形都存在时,我想返回shapetype.hexa。
现在,当谈到代码时,我希望这样:
public ShapeType resolveShapeType(final List<Shape> shapes) {
shapes.stream()
.filter(shape -> shape.getSideCount() == 6 || shape.getSideCount() == 4)
// I should have a stream with just rectangles and hexagons if present.
// what now?
}
5条答案
按热度按时间fcg9iug31#
你可以用
这将每个元素Map到它的边计数,并将它们减少到首选类型,这恰好是这里的最大计数,因此不需要自定义的减少函数。
这不是短路,但对于大多数用例来说,这就足够了。如果你想把操作的次数减少到必要的最低限度,事情会更复杂。
我们知道我们可以先停下来
HEXA
,但为了避免第二次通过,必须记住是否发生了RECT
在这种情况下没有HEXA
. 所以它搜索第一个元素,即RECT
或者HEXA
. 如果没有,GENERIC
如果第一个不是HEXA
,其余元素将检查HEXA
善良的。请注意,对于处理第一个RECT
,否filter
因为这意味着,RECT
也不是HEXA
,无法满足条件。但也应该很明显,这段代码,试图尽量减少检查的数量,是难以阅读比同等
for
循环。blmhpbnm2#
假设列表中只能显示这三种类型的形状,另一种选择是:
但我认为最直接(和有效)的方法是一个很好的旧for循环:
ijxebb2r3#
如果我明白你想做什么,那你可以用
anyMatch
. 比如,一种方法(流媒体
shapes
一次)将保留数组的形状。比如,nkoocmlb4#
也可以这样做:
在这里,我和你的朋友有点自由
ShapeType
:tbh如果添加
getShapeType()
方法,该方法为每个派生类型返回正确的类型。然后map()
例如,操作将只提取类型.map(Shape::getShapeType)
.这个
.filter()
会发现你感兴趣的群体,最大的形状被认为是集合的标签。。。tkqqtvp15#
听起来像是“reduce”或“collect/max”的例子。
假设您有一个选择“支配”类型的方法(您可以将它放在lambda中,但是作为一个方法,它更可读):
有几种方法可以使用它,例如:
您可能还需要查看collectors.maxby。顺便说一句,无论你采取什么方法,请给一些思考的行为,以防一个空名单。。。