Как сравнить домены почт?
Мне нужно сравнить домены почт и получить пользователей, которые имеют домен @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 шт):
Можно воспользоваться обычным регулярным выражением:
void task2() {
Pattern pattern = Pattern.compile("\\b\\S+@gmail\\.com");
Matcher matcher = pattern.matcher(str); // str - текст
while (matcher.find()) {
System.out.println(matcher.group());
}
}
К массиву строк не имеет смысла применять метод toString(), в результате будет получена строка вида [Ljava.lang.String;@{hashCode}.
Если нужно использовать Stream API, то проще получить поток строк из массива при помощи Arrays.stream или Stream.of, для которого вызвать требуемый терминальный метод, возвращающий булево значение:
Stream::allMatch-- условие-предикат выполняется для всех элементов потока, для пустого потока возвращаетсяtrueStream::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 у всех
)
// ... и т.д. как показано выше