为了账号安全,请及时绑定邮箱和手机立即绑定

是否有任何选项可以通过其属性从 Set/HashSet 中检索元素

是否有任何选项可以通过其属性从 Set/HashSet 中检索元素

斯蒂芬大帝 2021-07-08 18:01:29
假设我有: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()相反,我想要像地图(运行时 O(1))之类的东西,而不使用它。
查看完整描述

3 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

set.stream()

   .filter(x -> x.getMyParam1().equals("myParam1") && x.getMyParam2().equals("myParam2"))

   .findFirst();

但是在findFirst这里想一下……您正在使用 a 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


查看完整回答
反对 回复 2021-07-23
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

那么为什么不做某事。像这样在过滤器内部:

a-> "myParam1".equals(a.getP1()) && "myParam2".equals(a.getP2())


查看完整回答
反对 回复 2021-07-23
  • 3 回答
  • 0 关注
  • 140 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信