Как сравнить домены почт?

Мне нужно сравнить домены почт и получить пользователей, которые имеют домен @gmail.com. Как мне это реализовать?

void task2() throws IOException{
    
    // Второе задание
    // Вывести всех пользователей, которые используют только почту @gmail.com
    System.out.println("2");
    runParser()
        .filter(s -> s.getEmails().toString().contains("@gmail.com"))
        .forEach(s -> System.out.println(s.getID()));
}

json

{
    "id": 6958064,
    "status": "ACTIVE",
    "name": {
        "first": "Chadrick",
        "middle": "Bailey",
        "last": "Beatty"
    },
    "monthlySalary": "873.00",
    "birthday": "1984-10-17T01:43:46.668Z",
    "username": "Chadrick-Beatty",
    "password": "a3shYp4RtKOczzS",
    "emails": [
        "[email protected]",
        "[email protected]"
    ],
    "phoneNumber": "684.592.9283 x13888",
    "location": {
        "street": "84436 Brooke Avenue",
        "city": "New Earlineworth",
        "state": "Florida",
        "country": "Turkmenistan",
        "zip": "98029-5397",
        "coordinates": {
            "latitude": -39.0855,
            "longitude": -36.2158
        }
    },
    "website": "https://delicious-ant.org/",
    "domain": "somber-dimension.net",
    "job": {
        "title": "Product Research Agent",
        "descriptor": "Product",
        "area": "Research",
        "type": "Executive",
        "company": "Hintz, Rutherford and Kerluke"
    },
    "creditCard": {
        "number": "4477-2259-3629-9212",
        "cvv": "999",
        "issuer": "diners_club"
    },
    "uuid": "4e3596dd-d6f5-4509-ae95-86d7c13b54c5",
    "objectId": "654f75dde4b0b49c824555d0"
}

Data.java:

@Data
public class Data {
    private long id;
    private Status status;
    private Name name;
    private BigDecimal monthlySalary;
    private LocalDate birthday;
    private String username;
    private String password;
    private String[] emails;
    private String phoneNumber;
    private Location location;
    private String website;
    private String domain;
    private Job job;
    private CreditCard creditCard;
    private UUID uuid;
    private String objectId;
}

Ответы (2 шт):

Автор решения: Atamiq

Можно воспользоваться обычным регулярным выражением:

void task2() {
   Pattern pattern = Pattern.compile("\\b\\S+@gmail\\.com");
   Matcher matcher = pattern.matcher(str); // str - текст
   while (matcher.find()) {
      System.out.println(matcher.group());
   }
}
→ Ссылка
Автор решения: Nowhere Man

К массиву строк не имеет смысла применять метод toString(), в результате будет получена строка вида [Ljava.lang.String;@{hashCode}.

Если нужно использовать Stream API, то проще получить поток строк из массива при помощи Arrays.stream или Stream.of, для которого вызвать требуемый терминальный метод, возвращающий булево значение:

  • Stream::allMatch -- условие-предикат выполняется для всех элементов потока, для пустого потока возвращается true
  • Stream::anyMatch -- условие-предикат выполняется для хотя бы одного элемента потока, для пустого потока возвращается false

В качестве функции-предиката для проверки домена можно использовать String::matches с соответствующим регулярным выражением, но в данном случае достаточно будет String::endsWith.

void task2() throws IOException {
    // Второе задание
    // Вывести всех пользователей, которые используют только почту @gmail.com
    System.out.println("2");
    runParser()  // Stream<Data>
        .filter(s -> Stream.of(s.getEmails()) // поток емайлов Stream<String>
            .map(String::toLowerCase) // в нижнем регистре
            .allMatch(em -> em.endsWith("@gmail.com")) // домен gmail.com у всех
        ) 
        .map(Data::getId) // Stream<Long> поток идентификаторов
        .forEach(System.out::println); // вывести на печать
}

Если требуется дополнительно проверить, что должен быть хотя бы один емайл, следует сравнить массив c null и проверить его длину:

    runParser()  // Stream<Data>
        .filter(s -> Objects.nonNull(s.getEmail()) // не-null массив
            && s.getEmails().length > 0 // непустой массив 
            && Stream.of(s.getEmails()) // поток емайлов
                .map(String::toLowerCase) // в нижнем регистре
                .allMatch(em -> em.endsWith("@gmail.com")) // домен gmail.com у всех
        )
        // ... и т.д. как показано выше
→ Ссылка