java 如何通过匹配的键值列表过滤元素列表?

xwmevbvl  于 2023-06-20  发布在  Java
关注(0)|答案(4)|浏览(126)

我正在努力比较多个列表中的键/值,可能需要一些帮助。给定一个People的列表,它有一个firstNameage属性,以及一个单独的年龄列表,我如何过滤People列表以只返回那些具有其中一个匹配年龄的列表?

public class Main {
    public static void main(String[] args) {

        Person p1 = new Person("John", 25);
        Person p2 = new Person("Lisa", 54);
        Person p3 = new Person("Mike", 61);
        List<Person> people = new ArrayList<Person>();
        people.add(p1);
        people.add(p2);
        people.add(p3);

        List<Integer> ages = Arrays.asList(25, 54);
        List<Person> specificAges = people.stream().filter(p -> p.age == ages?????)

        System.out.println(specificAges);
    }
}

public class Person {
    private String firstName;
    private Integer age;

    public Person(String firstName, Integer age) {
        this.firstName = firstName;
        this.age = age;
    }

    @Override
    public String toString() {
        return firstName + " " + age;
    }
}

预期结果:["John 25", "Lisa 54"]

n53p2ov0

n53p2ov01#

可以在lambda函数中使用ages.contains(p.age)

List<Person> specificAges = people
    .stream()
    .filter(p -> ages.contains(p.getAge()))
    .collect(Collectors.toList());

我使用getter方法来获取每个Person类的年龄。

oalqel3c

oalqel3c2#

如果 stream 不是必需的,那么 for-loop 也足够了。

List<Person> specificAges = new ArrayList<>();
for (Person person : people) {
    if (ages.contains(person.age)) specificAges.add(person);
}

输出量

[John 25, Lisa 54]
pbwdgjma

pbwdgjma3#

您还可以创建一个单独的Person类,并使用注解进行快速构造函数、getter/setter开发。

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private String firstName;
    private Integer age;

    @Override
    public String toString() {
        return firstName + " " + age;
    }
}

代码的其余部分将保持不变。您可以使用一个流为每个循环,如前所述。

wgmfuz8q

wgmfuz8q4#

对于“更少代码”的解决方案,创建一个副本,然后使用removeIf()

List<Integer> specificAges = new ArrayList<>(people);
specificAges.removeIf(p -> !ages.contains(p.getAge()));

如果不需要保留原始列表,只需:

people.removeIf(p -> !ages.contains(p.getAge()));

相关问题