使用"不兼容类型"错误传输anyMatch失败

Ste*_*fan 4 java java-stream

我想用数字打印我给定的联系人,我正试图用流做.通过一点谷歌搜索,我看到人们正在按照我现在正在尝试的方式解决它.但我收到这个错误Incompatible types: PhoneNumber is not convertible to CharSequence,我不明白我需要做什么.错误发生在contactsByNumber Code: 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;
   }
}
Run Code Online (Sandbox Code Playgroud)

电话簿

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);
     }
 }
Run Code Online (Sandbox Code Playgroud)

GBl*_*ett 10

在这个部分:

public void contactsByNumber(String number) {
    phoneNumbers.stream().parallel().anyMatch(number::contains);
}
Run Code Online (Sandbox Code Playgroud)

它是一个Stream<PhoneNumber>,你试图将它视为一个String.您需要将其映射到它的name属性:

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

但是这个方法什么都不做,因为你忽略了结果anyMatch.如果要打印结果,可以更改anyMatchfilter然后打印:

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

此外,如果你没有充分的理由使用parallelStream,我建议不要使用一个,因为它有更多的开销