我正在使用的服务是在Java8中运行的。我正在使用SpEL根据输入表达式过滤对象的通用集合。当表达式计算RootObject中的顶级基本字段时,我正在成功筛选集合。SpEL集合选择功能根据RootObject中键、标签和/或类型的表达式返回经过筛选的RootObject集合。这个案子运作良好。
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable("collection", collection);
String selectionExpression = "#collection.?[key matches 'foo|foo2|foo3']";
我的问题是如何过滤原始集合返回RootObject的基于RootObject中的值列表中的其他对象中的计算字段的集合?即,返回所有在RootObject.values中具有列表项的RootObject,其中bject.name==foo或其他bject.count
集合对象的外观如下所示:
public class RootObject {
String key;
String label;
String type;
List<OtherObject> values;
public RootObject() {}
public RootObject(String key, String label, String type, List<OtherObject> values) {
this.key = key;
this.label = label;
this.type = type;
this.values = values;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public List<OtherObject> getValues() {
return values;
}
public void setValues(List<OtherObject> values) {
this.values = values;
}
}
public class OtherObject {
private String name;
private String label;
private Integer count;
private Integer totalCount;
private Boolean isSelected;
public OtherObject() {}
public OtherObject(String name, String label, int count, int totalCount, boolean isSelected) {
this.name = name;
this.label = label;
this.setCount(count);
this.isSelected = isSelected;
this.totalCount = totalCount;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getLabel() {
return this.label;
}
public void setLabel(String label) {
this.label = label;
}
public Integer getCount() {
return this.count;
}
public void setCount(Integer count) {
this.count = count;
}
public Integer getTotalCount() {
return this.totalCount;
}
public void setTotalCount(Integer totalCount) {
this.totalCount = totalCount;
}
public Boolean getIsSelected() {
return this.isSelected;
}
public void setIsSelected(Boolean isSelected) {
this.isSelected = isSelected;
}
}
你只需要做两个投影。在根对象集合中,您希望投影以查找那些根对象,其中在其值集合中,所需条件的投影不是空的。
#collection.?[!(values.?[name == 'foo' or count > 10 or isSelected == true].isEmpty())]
投影只是生成另一个列表,您可以基于任何布尔表达式进行投影。在一个投影中,您可以继续使用SpEL来计算布尔表达式,包括另一个投影。您只需要记住,投影返回一个列表,而投影条件需要是一个布尔值,因此您需要实际检查您正在查找的条件(在本例中,列表不是空的)。
下面是我做的测试,以向自己证明事实上它是正确的语法,并且工作正常:
@Test
public void test() {
final OtherObject otherFooOneNotSelected = new OtherObject("foo", "", 1, 1, false);
final OtherObject otherBarOneNotSelected = new OtherObject("bar", "", 1, 1, false);
final OtherObject otherFooTwelveNotSelected = new OtherObject("foo", "", 12, 12, false);
final OtherObject otherBarTwelveNotSelected = new OtherObject("bar", "", 12, 12, false);
final OtherObject otherFooOneSelected = new OtherObject("foo", "", 1, 1, true);
final OtherObject otherBarOneSelected = new OtherObject("bar", "", 1, 1, true);
final OtherObject otherFooTwelveSelected = new OtherObject("foo", "", 12, 12, true);
final OtherObject otherBarTwelveSelected = new OtherObject("bar", "", 12, 12, true);
final RootObject rootNoValues = new RootObject("noValues", "", "", Collections.<OtherObject>emptyList());
final RootObject rootFooOneNotSelected = new RootObject("rootFooOneNotSelected", "", "", Collections.singletonList(otherFooOneNotSelected));
final RootObject rootBarOneNotSelected = new RootObject("rootBarOneNotSelected", "", "", Collections.singletonList(otherBarOneNotSelected));
final RootObject rootBarTwelveNotSelected = new RootObject("rootBarTwelveNotSelected", "", "", Collections.singletonList(otherBarTwelveNotSelected));
final RootObject rootAllValues = new RootObject("allValues", "", "", Arrays.asList(
otherFooOneNotSelected,
otherBarOneNotSelected,
otherFooTwelveNotSelected,
otherBarTwelveNotSelected,
otherFooOneSelected,
otherBarOneSelected,
otherFooTwelveSelected,
otherBarTwelveSelected));
final Collection<RootObject> collection = Arrays.asList(rootNoValues, rootFooOneNotSelected, rootBarOneNotSelected, rootBarTwelveNotSelected, rootAllValues);
final ExpressionParser parser = new SpelExpressionParser();
final StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable("collection", collection);
final String selectionExpression = "#collection.?[!(values.?[name == 'foo' or count > 10 or isSelected == true].isEmpty())]";
final List<?> result = (List<?>) parser.parseExpression(selectionExpression).getValue(context);
assertEquals("Result", Arrays.asList(rootFooOneNotSelected, rootBarTwelveNotSelected, rootAllValues), result);
}
我不认为你能用纯粹的语言做到这一点;您可以在Java中实现它并注册一个自定义SpEL函数。
问题内容: 我只想将对象推入mongodb中的对象数组 并将对象推入需要执行的上述文档中 那么我如何使用 mgo驱动程序* 实现相同的功能 * 问题答案: 请尝试以下操作:
问题内容: 我有以下json文件: 我正在使用jq,并想获取“位置”为“斯德哥尔摩”的对象的“名称”元素。 我知道我可以通过 但是给定子键的值(在此),我无法弄清楚如何仅打印某些对象。 问题答案: 根据关于使用jq处理JSON的文章改编而成,您可以这样使用:
上课我需要做一个纸牌游戏(桥牌)。 我有一个Card类,它定义了一张卡的所有属性,还有一个Deck类,它生成了52张卡。还有一个手牌类,它可以将牌从牌组随机分配给四只手牌。 现在我需要制作一个方法,将玩家的手牌和目标牌作为输入,并返回该牌中排名最高的牌。我有: 我该怎么做才能返回所需的卡片?此外,我还需要知道如何从ArrayList中删除特定的Card对象(基于有关卡片的信息,例如它的等级和花色,
问题内容: 我有以下收藏: 当这个样子的: 现在我必须根据字段对集合进行排序,如何实现呢? 问题答案: 这是我的“ 1班轮”: Java 8的更新:对于int数据类型 甚至: 对于String数据类型(如注释中所示) ..它期望吸气剂
我正在尝试编写一个代码,从ArrayList的实例中移除某些对象。 体系结构: null null 代码: