繁体   English   中英

使用 Java 流过滤对象的 ArrayList 以返回字符串类型的 ArrayList

[英]Filter an ArrayList of Objects using Java Streams to return an ArrayList of type String

我在 SO 上找不到确切的解决方案。 我有一个Crowd class ,它由一个Crowd object 组成,它是一个People类型的 arraylist 。 People是一个 class 属性String name, Double bankBalance, Integer numberOfCarsOwned

在我的人群中 class 我有以下方法,我试图按以字母 P 开头的名称进行过滤,并返回这些String类型的 arraylist :

  public ArrayList<String> filterByLetterP(){
       ArrayList<String> filteredNames =  this.crowd.stream()
               .filter(name -> name.getName().contains("P"));
               return filteredNames;
    }

我的错误是:必需类型ArrayList<String>提供Stream<People>

注意:我的解决方案必须使用流。 如何纠正我的解决方案以使其正常工作?

参考资料如下。

People class定义:

public class People {

    private String name;
    private Double bankBalance;
    private Integer numberOfCarsOwned;

    public People(String name, Double bankBalance, Integer numberOfCarsOwned) {
        this.name = name;
        this.bankBalance = bankBalance;
        this.numberOfCarsOwned = numberOfCarsOwned;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getBankBalance() {
        return bankBalance;
    }

    public void setBankBalance(Double bankBalance) {
        this.bankBalance = bankBalance;
    }

    public Integer getNumberOfCarsOwned() {
        return numberOfCarsOwned;
    }

    public void setNumberOfCarsOwned(Integer numberOfCarsOwned) {
        this.numberOfCarsOwned = numberOfCarsOwned;
    }
}

Crowd class 定义:

public class Crowd {

    private ArrayList<People> crowd;

    public Crowd() {
        this.crowd = new ArrayList<>();
    }

    public ArrayList<People> getCrowd() {
        return crowd;
    }

    public void setCrowd(ArrayList<People> crowd) {
        this.crowd = crowd;
    }

    public void addPeopleToCrowd(People people){
        this.crowd.add(people);
    }

    public ArrayList<String> filterByLetterP(){
       ArrayList<String> filteredNames =  this.crowd.stream()
               .filter(name -> name.getName().contains("P"));
               return filteredNames;
    }
}

有几件事需要解决:

  1. 您应该使用String#startsWith而不是String#contains
  2. 你必须 map StreamPeople#name
  3. 您错过了收集Stream

如下图所示:

public List<String> filterByLetterP() {
    List<String> filteredNames = this.crowd.stream()
            .map(p -> p.getName())
            .filter(s -> s.startsWith("P"))             
            .collect(Collectors.toList());
    return filteredNames;
}

您应该更改过滤器,因为它不会检查以“P”开头的名称:

public List<String> filterByLetterP(){
    return this.crowd.stream()
            .map(People::getName)
            .filter(name -> name.charAt(0) == 'P')
            .collect(Collectors.toList());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM