java - 是否有任何选项可以通过其属性从 Set/HashSet 中检索元素,而无需在 java 中创建整个对象?

标签 java java-8

假设我有:

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/

相关文章:

javascript - 如何在 Javascript 中转换 JSON 字节

java - Android 切换按钮自定义大小/填充/间距

java - 未处理的异常类型错误

java - 连接关闭后结果集被清除。 SQLite

java - Eclipse 中的 Junit 测试失败,并出现 java.lang.NoClassDefFoundError : org/hamcrest/SelfDescribing

java - 如何更改日期选择器的 View 并在Android中的日期选择器中显示类似日历的 View ?

java - 箭头运算符 '->' 在 Java 中起什么作用?

java - 需要增强 Java 中嵌套 for 循环的建议

java-8 - Java 8 : aggregate an item list by values and to regroup by position range

java - 无法将 char[] 转换为 java 8 中的流