gpt4 book ai didi

java - 为对象列表的子字段调用 Iterables.contains

转载 作者:行者123 更新时间:2023-12-01 15:21:07 25 4
gpt4 key购买 nike

我希望能够测试列表是否包含具有给定键值的对象

例如,我想做一些类似 Iterables.contains(l2, "lname", "Jordan")); 的事情,而不必在 l2< 中创建所有其他 Map 对象,如下所示/p>

//List<String> l = Arrays.asList("Mickael", "Jordan", "His Airness");
//System.out.println(Iterables.contains(l, "Jordan"));

Map<String, String> p1 = new HashMap<String, String>();
p1.put("fname", "Mickael");
p1.put("lname", "Jordan");
p1.put("nname", "His Airness");

Map<String, String> p2 = new HashMap<String, String>();
p2.put("fname", "Paul");
p2.put("lname", "Pierce");
p2.put("nname", "The Truth");
List<Map<String, String>> l2 = Arrays.asList(p1, p2);
Map<String, String> p3 = new HashMap<String, String>();
p3.put("fname", "Mickael"); //
p3.put("lname", "Jordan");
p3.put("nname", "His Airness"); //
System.out.println(Iterables.contains(l2, p3));

我想知道是否有这样的 Guava 功能,并且不在l2上进行循环并测试每个elt.get(“lname”)

编辑

回答了 3 个解决方案:尝试看看哪一个性能更好

System.out.println(Iterables.any(l2, withEntry("lname", "Jordan"))); //@axtavt
System.out.println(has("lname", "Jordan")); //@JB
System.out.println(Iterables.any(l2, new KeyValuePredicate("lname", "Jordan"))); //@JB

public static Boolean has(final String key, final String value) {
return Iterables.any(l2, new Predicate<Map<String, String>>() {
@Override
public boolean apply(Map<String, String> input) {
return input.get(key).equals(value);
}
});
}

public static Predicate<Map<String, String>> withEntry(final String key, final String value) {
return new Predicate<Map<String, String>>() {
public boolean apply(Map<String, String> input) {
return value.equals(input.get(key));
}
};
}

class KeyValuePredicate implements Predicate<Map<String, String>>{
private String key;
private String value;
public KeyValuePredicate(String key, String value) {
super();
this.key = key;
this.value = value;
}
@Override
public boolean apply(Map<String, String> arg0) {
// TODO Auto-generated method stub
return arg0.get(key).equals(value);
}

}

最佳答案

return Iterables.any(l2, new Predicate<Map<String, String>>() {
@Override
public boolean apply(Map<String, String> input) {
return input.get("lname").equals("Jordan");
}
});

但是当您应该使用具有属性的对象时,您却在使用 map 。

当然,如果您需要使用各种属性多次执行此操作,则应该将谓词转换为非匿名、可重用的类:

return Iterables.any(l2, new KeyValuePredicate("lname", "Jordan"));

关于java - 为对象列表的子字段调用 Iterables.contains,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10918455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com