有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java流anyMatch失败,出现“不兼容类型”错误

我想打印我给定号码集中的联系人,我正在尝试使用streams。通过谷歌搜索,我看到人们用我现在尝试的方式解决了这个问题。但是我得到了这个错误,我不明白我需要做什么。错误在方法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);
     }
 }

共 (1) 个答案

  1. # 1 楼答案

    在本节中:

    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流,我建议您不要使用它,因为it has a lot more overhead