使用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,然后过滤名称。应该是人,而不是人。抱歉打错了!