Сбой потока anyMatch с ошибкой «Несовместимые типы» - PullRequest
0 голосов
/ 05 февраля 2019

Я хочу напечатать контакты из моего набора по номеру, и я пытаюсь сделать это с потоками.Немного погуглив, я увидел, как люди решают это так, как я сейчас пытаюсь.Но я получаю эту ошибку Incompatible types: PhoneNumber is not convertible to CharSequence, и я не понимаю, что мне нужно делать.Ошибка в методе contactsByNumber Код: PhoneNumber.java

class PhoneNumber {

   private String name;
   private String number;

   public PhoneNumber(String name, String number) {
       this.name = name;
       this.number = number;
   }

   public String getName() {
       return name;
   }

   public String getNumber() {
       return number;
   }
}

Телефонная книга

class PhoneBook {
    private Set<PhoneNumber> phoneNumbers;

    public PhoneBook() {
        this.phoneNumbers = new HashSet<>();
    }

    public void addContact(String name, String number) throws DuplicateNumberException {
        PhoneNumber pn = new PhoneNumber(name, number);
        if(phoneNumbers.contains(pn)) {
            throw new DuplicateNumberException(number);
         } else {
             phoneNumbers.add(new PhoneNumber(name, number));
         }
     }

     public void contactsByNumber(String number) {
          phoneNumbers.stream().parallel().anyMatch(number::contains);
     }
 }

1 Ответ

0 голосов
/ 05 февраля 2019

В этом разделе:

public void contactsByNumber(String number) {
    phoneNumbers.stream().parallel().anyMatch(number::contains);
}

это Stream<PhoneNumber>, и вы пытаетесь рассматривать его как String.Вам необходимо сопоставить его с атрибутом name:

public void contactsByNumber(String number) {
    phoneNumbers.stream().parallel().map(PhoneNumber::getName).anyMatch(number::contains);
}

Однако этот метод ничего не делает, так как вы игнорируете результат anyMatch.Если вы хотите распечатать результаты, вы можете изменить anyMatch на filter, а затем напечатать:

public void contactsByNumber(String number) {
    phoneNumbers.stream()
                .parallel()
                .map(PhoneNumber::getName)
                .filter(number::contains)
                .forEach(System.out::println);
}

Также, если у вас нет веских причин для использования parallelStream, я бы порекомендовал не использовать один, так как он имеет намного больше накладных расходов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...