For loop 转换和过滤一个集合,比较它的对象';使用流的数组的getter
我这里有一些工作的,不雅的代码: 自定义对象是:For loop 转换和过滤一个集合,比较它的对象';使用流的数组的getter,for-loop,java-8,java-stream,For Loop,Java 8,Java Stream,我这里有一些工作的,不雅的代码: 自定义对象是: public class Person { private int id; public getId() { return this.id } } 我有一个包含集合allPersons的类,包含所有可用的主题。我想根据我选择的一个或多个ID提取一个新的集合。我已经写了一些使用嵌套的增强for循环的东西,但是它给我的印象是效率低下,并且会进行很多不必要的比较。我已经习惯了使用Java8,但不太清楚如何将集合与数组进行比较。下面
public class Person {
private int id;
public getId() { return this.id }
}
我有一个包含集合allPersons
的类,包含所有可用的主题。我想根据我选择的一个或多个ID提取一个新的集合。我已经写了一些使用嵌套的增强for循环的东西,但是它给我的印象是效率低下,并且会进行很多不必要的比较。我已经习惯了使用Java8,但不太清楚如何将集合与数组进行比较。下面是我的工作代码,但很详细:
public class MyProgram {
private Set<Person> allPersons; // contains 100 people with Ids 1-100
public Set<Person> getPersonById(int[] ids) {
Set<Person> personSet = new HashSet<>() //or any type of set
for (int i : ids) {
for (Person p : allPersons) {
if (p.getId() == i) {
personSet.add(p);
}
}
}
return personSet;
}
}
但是,使用@Flown建议的下半部分,如果程序设计为具有映射,那么它也会工作(并且工作效率更高)正如您所说,您可以使用流::anyMatch
操作引入流::过滤器
步骤
public Set<Person> getPersonById(int[] ids) {
Objects.requireNonNull(ids);
if (ids.length == 0) {
return Collections.emptySet();
}
return allPersons.stream()
.filter(p -> IntStream.of(ids).anyMatch(i -> i == p.getId()))
.collect(Collectors.toSet());
}
这个最重要的答案肯定适用于原样的代码。在这一点上,我必须进行大量的重新格式化,以使底部在程序的其余部分都能正常工作,但这是一个好主意。如果传递的id
中有一个与p.getId()
不匹配,是否有方法抛出IllegalArgumentException?@NateH06:只需删除.filter(idMapping::containsKey)
。然后,如果(resultSet.contains(null))抛出新的IllegalArgumentException(…),则执行单个if代码>之后。啊,好吧,那么.mapToObj(idMapping::get)
本身就足够了?如果id不是idMapping的键,它将只在resultSet
中插入一个空的Person
。事实上,我现在看到@Flown的答案,IntelliJ告诉我它无法解析他们顶级答案的IntStream
部分。我已经检查过了,正如我导入的java.util*一样,它应该可以工作。我将IntStream
替换为Arrays.stream(ids)
,解决了这个问题。所以我的筛选方法看起来像:.filter(p->(Arrays.stream(ids).anyMatch(i->i==p.getId()))
return allPersons.stream()
.filter(p -> (Arrays.stream(ids).anyMatch(i -> i == p.getId())) )
.collect(Collectors.toSet());
public Set<Person> getPersonById(int[] ids) {
Objects.requireNonNull(ids);
if (ids.length == 0) {
return Collections.emptySet();
}
return allPersons.stream()
.filter(p -> IntStream.of(ids).anyMatch(i -> i == p.getId()))
.collect(Collectors.toSet());
}
private Map<Integer, Person> idMapping;
public Set<Person> getPersonById(int[] ids) {
Objects.requireNonNull(ids);
return IntStream.of(ids)
.filter(idMapping::containsKey)
.mapToObj(idMapping::get)
.collect(Collectors.toSet());
}