【发布时间】:2018-08-24 09:53:52
【问题描述】:
标题可能有点含糊,但这是我所拥有的(私有化代码):
具有一些字段的类,包括 BigDecimal 和 Date:
class MyObj{
private java.math.BigDecimal percentage;
private java.util.Date date;
// Some more irrelevant fields
// Getters and Setters
}
在另一个类中,我有一个这些对象的列表(即java.util.List<MyObj> myList)。我现在想要的是一个 Java 8 流,用于检查列表是否符合我的验证器的日期和百分比顺序。
例如,以下列表是真实的:
[ MyObj { percentage = 25, date = 01-01-2018 },
MyObj { percentage = 50, date = 01-02-2018 },
MyObj { percentage = 100, date = 15-04-2019 } ]
但是这个列表是错误的,因为百分比的顺序不正确:
[ MyObj { percentage = 25, date = 01-01-2018 },
MyObj { percentage = 20, date = 01-02-2018 },
MyObj { percentage = 100, date = 15-04-2019 } ]
而且这个列表也是错误的,因为日期的顺序不正确:
[ MyObj { percentage = 25, date = 10-03-2018 },
MyObj { percentage = 50, date = 01-02-2018 },
MyObj { percentage = 100, date = 15-04-2019 } ]
一种可能的解决方案是创建Pairslike this,然后使用! 和.anyMatch 检查每个Pair<MyObj>。但如果可能的话,我真的不想为此目的创建一个Pair 类。
是否有可能使用.reduce 或其他方法来循环成对的MyObj 来检查它们?使用 Java 8 流检查列表中 MyObj 的所有日期和百分比是否按正确顺序的最佳方法是什么?
另一种可能是按日期对列表进行排序,然后检查它们是否都按百分比顺序排列,如果这比检查两个字段是否相同更容易的话。不过,比较成对的MyObj 的百分比仍然存在同样的问题。
(PS:我将它用于com.vaadin.server.SerializablePredicate<MyObj> validator,我更喜欢Java 8 lambda,因为我也为其他验证器使用了一些,所以它会更符合其余代码。然而,在我的问题中,Java 8 lambda 更像是一种偏好而不是要求。)
【问题讨论】:
-
如果我理解正确,您希望这两个字段都是排序中的主键。除非你以某种方式将它们结合起来,否则这对我来说是不可能的。我看不出这怎么可能。还是我误会了?
-
@JackFlamp 据我了解,他只是想检查一下,即日期或百分比可能出现故障,但验证器应将其报告为无效。
-
您能否详细说明您将如何使用
SerializablePredicate(顺便说一句,它不是JDK 类)?我不确定你是否真的必须使用流。 -
你能澄清一下:你想执行排序吗? - 或者只是验证现有订单是否满足您的要求?
-
那么您希望百分比序列和日期序列不递减吗?我不知道您为什么开始谈论与验证无关的排序,并且正如其他人指出的那样,当某些元素在序列中时,这种比较是不可能的。
标签: java sorting java-8 java-stream boolean-expression