gpt4 book ai didi

java - 使用 Guava 根据一个属性过滤列表

转载 作者:搜寻专家 更新时间:2023-10-30 21:09:58 25 4
gpt4 key购买 nike

我有一个名为 Person 的类 -

public class Person implements Nameable {
private String name;

public String getName(){
return name;
}
}

现在我有两个列表 -

List<Person>  persons = // some persons
List<Person> subsetOfPersons = // some duplicate persons, but different objects and don't share the same identity

现在我想过滤 subsetOfPersons 中不存在的 persons,相等标准是 name 属性,Person 没有 equals。

我该怎么做?

最佳答案

我敢肯定有一种更简单的方法......为了比较,下面将把人转换成名字。对于 subsetOfPersons,我们实际上直接创建了一个姓名列表,因为这就是我们真正需要的。对于,我们将转换限制在比较的上下文中。

    Iterable<Person> filtered = Iterables
.filter(
persons,
Predicates.not(
Predicates.compose(
Predicates.in(ImmutableSet.copyOf(Iterables.transform(subsetOfPersons, personToNamefunction))),
personToNamefunction
)
)
);

编辑:认为您可能会喜欢 JUnit:

package com.stackoverflow.test;

import static org.junit.Assert.*;

import java.util.Iterator;

import org.junit.Test;

import com.google.common.base.Function;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;

public class PersonTest {
public class Person {
private String name;

public String getName(){
return name;
}

public void setName(String name) {
this.name = name;
}
}

@Test
public void testNameBasedFiltering() {
Person bob = createPerson("bob");
Person jim = createPerson("jim");
Person pam = createPerson("pam");
Person roy = createPerson("roy");

ImmutableList<Person> persons = ImmutableList.of(
bob,
jim,
pam,
roy);
ImmutableList<Person> subsetOfPersons = ImmutableList.of(
createPerson("jim"),
createPerson("pam"));

Function<Person, String> personToNamefunction = new Function<Person, String>() {
public String apply(Person arg0) {
return arg0.getName();
}
};

Iterable<Person> filtered = Iterables
.filter(
persons,
Predicates.not(
Predicates.compose(
Predicates.in(ImmutableSet.copyOf(Iterables.transform(subsetOfPersons, personToNamefunction))),
personToNamefunction
)
)
);

for (Person person : filtered) {
assertNotSame(jim, person);
assertNotSame(pam, person);
}
}

public Person createPerson(String name) {
Person person = new Person();
person.setName(name);

return person;
}

}

再次编辑:第一次错过了“不”的要求。轻松修复——使用谓词,您只需用 Predicates.not(..) 包装即可!

关于java - 使用 Guava 根据一个属性过滤列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5793907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com