如何在Java 8中使用多个筛选条件并且使用OR条件?

huangapple go评论112阅读模式
英文:

how to use multiple filter using OR conditon in java 8

问题

如何在Java 8中使用多个过滤器并使用OR条件:

  1. return getAllData().stream()
  2. .filter(emp -> emp.getEmpName().equals(empName) || emp.getEmpEmailId().equals(empEmailId))
  3. .collect(Collectors.toList());

我尝试过这样做,但它不接受我的.getEmailId()

有人能帮忙吗?

英文:

how to use multiple filter using OR conditon in java 8

  1. return getAllData().stream()
  2. .filter(emp -> emp.getEmpName().equals(empName) && emp->emp.getEmpEmailId().equals(empEmailId))
  3. .collect(Collectors.toList());

i've tried this butnits not accepting my .getEmailId()

can anyone please help

答案1

得分: 1

  1. 简单的解决方案是使用简单的'or'表达式
  2. ```java
  3. @Test
  4. void test() {
  5. var allData = List.of(
  6. new Employee("john", "a@b.c"),
  7. new Employee("doe", "a@b.c"),
  8. new Employee("jane", "x@y.z")
  9. );
  10. var filtered = allData.stream()
  11. .filter(emp -> "jane".equals(emp.empName()) || "x@y.z".equals(emp.empName()))
  12. .collect(Collectors.toList());
  13. }

如果过滤条件描述了关于这个“employee”特定的内容,您可以将其封装在类内部,像这样:

  1. record Employee(String empName, String empEmailId) {
  2. private boolean hasNameOrEmail(String name, String email) {
  3. return name.equals(this.empName) || email.equals(this.empEmailId);
  4. }
  5. }
  6. @Test
  7. void test() {
  8. // ...
  9. var filtered = allData.stream()
  10. .filter(emp -> emp.hasNameOrEmail("jane", "x@y.z"))
  11. .collect(Collectors.toList());
  12. }

最后,如果您想创建更通用的东西,您可以声明不同的'Predicate'对象,可以使用.or()链接:

  1. public Predicate<Employee> hasName(String lookingFor) {
  2. return emp -> lookingFor.equals(emp.empName());
  3. }
  4. public Predicate<Employee> hasEmail(String lookingFor) {
  5. return emp -> lookingFor.equals(emp.empEmailId());
  6. }
  7. @Test
  8. void test() {
  9. // ...
  10. var filtered = allData.stream()
  11. .filter(hasName("jane").or(hasEmail("x@y.z")))
  12. .collect(Collectors.toList());
  13. }
英文:

A simple solution will be to use the simple 'or' expression:

  1. @Test
  2. void test() {
  3. var allData = List.of(
  4. new Employee(&quot;john&quot;, &quot;a@b.c&quot;),
  5. new Employee(&quot;doe&quot;, &quot;a@b.c&quot;),
  6. new Employee(&quot;jane&quot;, &quot;x@y.z&quot;)
  7. );
  8. var filtered = allData.stream()
  9. .filter(emp -&gt; &quot;jane&quot;.equals(emp.empName()) || &quot;x@y.z&quot;.equals(emp.empName()))
  10. .collect(Collectors.toList());
  11. }

If the filtering criteria is describing something specific about this employee, you can encapsulate it inside the class, like this:

  1. record Employee (String empName, String empEmailId) {
  2. private boolean hasNameOrEmail(String name, String email) {
  3. return name.equals(this.empName) || email.equals(this.empEmailId);
  4. }
  5. }
  6. @Test
  7. void test() {
  8. // ...
  9. var filtered = allData.stream()
  10. .filter(emp -&gt; emp.hasNameOrEmail(&quot;jane&quot;, &quot;x@y.z&quot;))
  11. .collect(Collectors.toList());
  12. }

Lastly, if you want to create something more generic, you can declare different Predicate objects that can be chained with .or() :

  1. public Predicate&lt;Employee&gt; hasName(String lookingFor) {
  2. return emp -&gt; lookingFor.equals(emp.empName());
  3. }
  4. public Predicate&lt;Employee&gt; hasEmail(String lookingFor) {
  5. return emp -&gt; lookingFor.equals(emp.empEmailId());
  6. }
  7. @Test
  8. void test() {
  9. // ...
  10. var filtered = allData.stream()
  11. .filter(hasName(&quot;jane&quot;).or(hasEmail(&quot;x@y.z&quot;)))
  12. .collect(Collectors.toList());
  13. }

huangapple
  • 本文由 发表于 2023年3月3日 21:54:52
  • 转载请务必保留本文链接:https://go.coder-hub.com/75627970.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定