Поток Java 8 - как найти родительскую сущность из дочернего атрибута или набора дочерних атрибутов? - PullRequest
0 голосов
/ 24 мая 2019

Это следующий шаг по сравнению с этим вопросом Я писал ранее.

Сценарий теперь похож на:

public class A {
    private String id;
    @ManyToOne
    private B b;
    @ManyToMany
    private Set<B> bSet;
    // getters and setters
}

и

public class B {
    private String id;
    // other attributes
    // getters and setters
}

Как найти экземпляр A, когда у меня есть экземпляр B с использованием stream() API? Я пытался что-то вроде:

public A findAFromB(B b) {
    List<A> aList = aService.findAll();
    Optional<A> matchingObject = aList.stream()
        .filter(/*find whether a.getB().equals(b) OR a.getBSet().contains(b)*/)
        .getA();
    return (A) matchingObject.get();
}

Как правильно написать этот фильтр?

1 Ответ

1 голос
/ 24 мая 2019

Вы можете реализовать его следующим образом:

public static A findAFromB(B b) {
    List<A> aList = aService.findAll();
    return aList.stream()
            .filter((A a) -> a.getB().equals(b) || a.getBSet().contains(b))
            .findFirst()
            .get();
}

Но он не будет работать с реализацией по умолчанию B::equals(), а именно:

public boolean equals(Object obj) {
    return (this == obj);
}

т.е. 2объекты класса B будут равны, только если они являются одним и тем же экземпляром.Если вы создадите 2 объекта класса B с одинаковым значением для каждого поля, equals() все равно вернет false.Вот пример:

B b1 = new B();
b1.setId("1234")

B b2 = new B();
b2.setId("1234")

System.out.println(b1 == b1); // displays true
System.out.println(b1.equals(b1)); // displays true
System.out.println(b2 == b1); // displays false
System.out.println(b2.equals(b1)); // displays false    

В вашем случае есть некоторый объект класса B, который автоматически создается JPA.Это означает, что в памяти могут быть различные объекты класса B с одинаковыми id.

Вы можете указать собственную реализацию equals().У каждой достойной IDE есть способ автоматически сгенерировать его.Например, здесь представляется разумным считать, что 2 B экземпляров равны, если они имеют одинаковые id:


public class B {

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    B b = (B) o;
    return Objects.equals(id, b.id);
  }
}
System.out.println(b1 == b1); // displays true
System.out.println(b1.equals(b1)); // displays true
System.out.println(b2 == b1); // displays false
System.out.println(b2.equals(b1)); // displays true  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...