Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java Streams过滤对象的ArrayList以返回String类型的ArrayList_Java_Arraylist_Java Stream - Fatal编程技术网

使用Java Streams过滤对象的ArrayList以返回String类型的ArrayList

使用Java Streams过滤对象的ArrayList以返回String类型的ArrayList,java,arraylist,java-stream,Java,Arraylist,Java Stream,我找不到这个问题的精确解,所以。我有一个Crowd类,它由Crowd对象组成,该对象是People类型的数组列表People是一个具有属性字符串名、双银行余额、整数的类 在我的群组类中,我使用以下方法,通过以字母p开头的名称进行筛选,并将其返回为String类型的arraylist: public ArrayList<String> filterByLetterP(){ ArrayList<String> filteredNames = this.cr

我找不到这个问题的精确解,所以。我有一个
Crowd
类,它由
Crowd
对象组成,该对象是
People
类型的数组列表
People
是一个具有属性
字符串名、双银行余额、整数的类

在我的群组类中,我使用以下方法,通过以字母p开头的名称进行筛选,并将其返回为
String
类型的arraylist:

  public ArrayList<String> filterByLetterP(){
       ArrayList<String> filteredNames =  this.crowd.stream()
               .filter(name -> name.getName().contains("P"));
               return filteredNames;
    }
群组
类别定义:

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

公共类人群{
私人ArrayList人群;
公众人群(){
this.crowd=new ArrayList();
}
公共阵列列表getCrowd(){
回归人群;
}
公共无效集合群组(ArrayList群组){
this.crowd=人群;
}
public void addPeopleToCrowd(人){
this.crowd.add(人);
}
公共ArrayList filterByLetterP(){
ArrayList filteredNames=this.crowd.stream()
.filter(name->name.getName().contains(“P”));
返回过滤器名称;
}
}

有几件事需要解决:

  • 您应该使用
    String#startsWith
    而不是
    String#contains
  • 您必须将
    映射到
    人名
  • 您没有收集
  • 按如下所示操作:

    public List<String> filterByLetterP() {
        List<String> filteredNames = this.crowd.stream()
                .map(p -> p.getName())
                .filter(s -> s.startsWith("P"))             
                .collect(Collectors.toList());
        return filteredNames;
    }
    
    public List filterByLetterP(){
    List filteredNames=this.crowd.stream()
    .map(p->p.getName())
    .filter(s->s.startsWith(“P”))
    .collect(Collectors.toList());
    返回过滤器名称;
    }
    
    您应该更改过滤器,因为它不会检查以字母“p”开头的名称:

    public List<String> filterByLetterP(){
        return this.crowd.stream()
                .map(People::getName)
                .filter(name -> name.charAt(0) == 'P')
                .collect(Collectors.toList());
    }
    
    public List filterByLetterP(){
    返回此.crowd.stream()
    .map(人物::getName)
    .filter(name->name.charAt(0)='P')
    .collect(Collectors.toList());
    }
    
    这将不起作用,因为
    Collectors.toList()
    需要类型
    List
    。我查过了。你能给个建议吗?并解释映射的要求?谢谢。@loco-我已将返回的类型更改为
    List
    。现在就行了,行了。谢谢,我接受你的回答。如果可能的话,你还能解释一下map的用途以及为什么我不能使用ArrayList吗?更好的方法是先使用
    map()
    ,然后再检查以
    P
    开头的字母:
    返回this.crowd.stream().map(People::getName).filter(name->name.startsWith(“P”).collector(collector.toList())
    是一种中间操作,它通过将给定函数应用于此流的元素来返回值。您的解决方案不允许我使用
    .charAt
    方法-可能类型不正确?另外,
    Person
    不是一个类,我的类是
    People
    ,所以我相信你可能有打字错误?谢谢,你说得对。首先,我应该使用map,然后过滤名称。应该是人,而不是人。抱歉打错了!