假设我有:
Set<MyObj> set = new HashSet<>();
set.add(new MyObj("myParam1","myParam2","myParam3"));
set.add(new MyObj("myParam11","myParam22","myParam33"));
set.add(new MyObj("myParam111","myParam222","myParam333"));.....
public class MyObj {
private String p1;
private String p2;
private String p3;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyObj myObj = (MyObj) o;
return Objects.equals(getP1(), myObj.getP1()) &&
Objects.equals(getP2(), myObj.getP2());
}
@Override
public int hashCode() {
return Objects.hash(getP1(), getP2());
}
}
我想在不创建新对象的情况下,通过p1和p2
检索元素
示例:我得到 2 个字符串:"myParam1","myParam2"
我想要结果:MyObj("myParam1","myParam2","myParam3")
我不想要这个:
set.stream().filter(a->a.equals(new MyObj("myParam1","myParam2",null))).findFirst()
相反,我想要类似 map 的东西(运行时 O(1)),而不使用它。
最佳答案
set.stream()
.filter(x -> x.getMyParam1().equals("myParam1") && x.getMyParam2().equals("myParam2"))
.findFirst();
但是在这里想一下findFirst
...您正在使用Set
,所以它没有什么意义。为了让这一点更清楚一点:
Set<String> set = new HashSet<>();
set.add("hello");
set.add("world");
set.add("jug");
System.out.println(set.stream().findFirst().get()); // world
// add them
IntStream.range(0, 100_000)
.mapToObj(i -> "" + i)
.forEachOrdered(set::add);
// remove them immediatly after
IntStream.range(0, 100_000)
.mapToObj(i -> "" + i)
.forEachOrdered(set::remove);
System.out.println(set.stream().findFirst().get()); // hello
关于java - 是否有任何选项可以通过其属性从 Set/HashSet 中检索元素,而无需在 java 中创建整个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51859156/