Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/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
For loop 转换和过滤一个集合,比较它的对象';使用流的数组的getter_For Loop_Java 8_Java Stream - Fatal编程技术网

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