[英]Java Using Stream and Lambda Expressions Instead of Iterator
我有一个计算机科学课程的作业,我们的老师希望我们为迭代器使用Stream和Lambda表达式。 我没有看到警告,而是根据自己的喜好编写了所需的代码,这里是:
static List<User> getUsers(String firstName){
Iterator<User> it = users.iterator();
ArrayList<User> tempList = new ArrayList<User>();
while(it.hasNext()){
User tempUser = it.next();
if(tempUser.getFirstName().equals(firstName)){
tempList.add(tempUser);
}
}
return tempList;
}
如何将其转换为Stream&Lambda代码? 非常感谢您的回答。
尝试这个
List<User> tempUsers = users.stream()
.filter(tempUser -> tempUser.getFirstName().equals(firstName))
.collect(Collectors.toList());
//TODO do something useful with it
您的整个方法可以简化为一个不使用中间变量作为List的语句:
static List<User> getUsers(String firstName){
return users.stream() //iterate
.filter(u -> u.getFirstName().equals(firstName)) //keep good ones
.collect(Collectors.toList()); //collect them in List
}
u
在filter方法中是一个局部变量,它将代表users
列表的每个元素,您可以根据需要命名它 .toCollection(ArrayList::new)
将确保您拥有一个ArrayList而不是toList()
,该列表稍后可以更改,但使用它没有问题。 无法保证返回的List的类型,可变性,可序列 toList()
或线程安全性; 如果需要对返回的List进行更多控制,请使用 doc中的toCollection(Supplier) 您可以从用户创建流,然后执行filter
操作以保留名称等于firstName
所有用户,然后利用Collectors.toCollection
将结果累加到ArrayList
。
List<User> tempList = users.stream()
.filter(e -> e.getFirstName().equals(firstName))
.collect(Collectors.toCollection(ArrayList::new));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.