我有List<MyObject> list
。
MyObject
看起来像这样:
public class MyObject {
String typeOfObject;
Integer anInteger;
Integer value;
}
如何从list
typeOfObject = "objectA"
和anInteger = 1
获取对象?
我的目标是使用value
的{{1}}设置多个变量。
我看了MyObject
,但似乎我的搜索条件只能基于一个属性?
答案 0 :(得分:1)
您必须覆盖equals()
和hashcode()
才能完成引用this链接以实现此目的。
答案 1 :(得分:1)
谓词可以完全按照您的意愿执行,并且可以根据您的需要处理任意数量的属性。您只需要使用您要测试的任何条件来实现evaluate()方法。
public class MyPredicate implements Predicate {
private String testId;
private String otherId;
public MyPredicate(String testId,String otherId) {
this.testId = testId;
this.otherId = otherId;
}
public boolean evaluate( Object obj ) {
boolean match = false;
if( obj instanceof MyObject ) {
if( testId.equalsIgnoreCase( ((MyObject)obj).getId())
&& otherId.equalsIgnoreCase( ((MyObject)obj).getOtherId()) ) {
match = true;
}
}
return match;
}
}
因此,在您的特定情况下,evaluate方法看起来像:
public boolean evaluate( Object obj ) {
boolean match = false;
if( obj instanceof MyObject ) {
if( "objectA".equals( ((MyObject)obj).typeOfObject )
&& 1 == ((MyObject)obj).anInteger ) {
match = true;
}
}
return match;
}
答案 2 :(得分:1)
如果您使用的是Java 8,则可以使用filter
来获取符合条件的元素,例如使用lambda表达式。您还可以实施自定义Predicate
并在filter
List<MyObject> objects = Arrays.asList(
new MyObject("foo", 1, 42),
new MyObject("foo", 3, 23),
new MyObject("bar", 3, 42),
new MyObject("foo", 4, 42));
List<MyObject> filtered = objects.stream()
.filter(o -> o.typeOfObject.equals("foo") && o.value == 42)
.collect(Collectors.toList());
System.out.println(filtered);
[(foo,1,42), (foo,4,42)]
输出为class MyObject {
String typeOfObject;
Integer anInteger;
Integer value;
public MyObject(String type, int i, int v) {
this.typeOfObject = type;
this.anInteger = i;
this.value = v;
}
public String toString() {
return String.format("(%s,%d,%d)", typeOfObject, anInteger, value);
};
}
,使用此测试类:
{{1}}