我想从我给定的数字集中打印联系人,我正在尝试使用流来完成。通过一点谷歌搜索,我看到人们以我现在正在尝试的方式解决它。但是我收到了这个错误 Incompatible types: PhoneNumber is not convertible to CharSequence,我不明白我需要做什么。错误出在 contactsByNumber 方法中
代码:
电话号码.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);
     }
 }

最佳答案

在这个部分:

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);
}

此外,如果您没有充分的理由使用 parallel Stream,我建议您不要使用,因为 it has a lot more overhead

10-08 07:15