gpt4 book ai didi

java - 如何获取我的对象的特定属性?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:11:12 24 4
gpt4 key购买 nike

假设我有这门课。

class People {
private String name;
private int age;
/** other stuff constructor / getters / setters / etc. **/
}

假设我有这个列表:

List<People> people = Arrays.asList(new People("Mark", 21), new People("Bob",17), new People("Alex", 22));

现在我希望能够得到一个 List对于特定属性的所有用户。

使用 Java 8,我可以创建一个方法来接受我想要的函数:

public static <X, Y> List<Y> processElements(Iterable<X> source, Function <X, Y> mapper) {
List<Y> l = new ArrayList<>();
for (X p : source)
l.add(mapper.apply(p));
return l;
}

然后我将能够执行一些调用,例如:

List<String> listNames = processElements(people, p -> p.getName()); 
List<Integer> listAges = processElements(people, p -> p.getAge());

然而,这在 Java 7 中是不可能的(我知道它存在于 Guava 中,但我会想出一个仅使用 JDK 的解决方案)。

这是我使用反射得出的结论:

public static List<Object> processElements(List<People> l, String fieldName) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
Field field = People.class.getDeclaredField(fieldName);
field.setAccessible(true);
List<Object> list = new ArrayList<>();
for(People p : l){
list.add(field.get(p));
}
field.setAccessible(false);
return list;
}

现在我可以做类似 List<Object> listNames = processElements(people, "name"); 的事情了效果很好。

但我对此感到不舒服:

  1. 我收到一个 List<Object>
  2. 每当我使用反射时,我总是觉得它存在一个更好的实现而不是使用它
  3. 使用 field.setAccessible(true);不是很安全

所以我的问题是:

  1. 是否可以在不使用 JDK 反射(不使用 Guava 或 Functional Java)的情况下做同样的事情?
  2. 如何根据作为参数传递给我的方法的字段类型获取字符串或整数列表?

谢谢

最佳答案

您可以在 Java 7 中使用匿名类来完成与 Java 8 相同的操作

public static <X, Y> List<Y> processElements(Iterable<X> source, Function <X, Y> mapper) {
List<Y> l = new ArrayList<>();
for (X p : source)
l.add(mapper.apply(p));
return l;
}

List<String> listNames = processElements(people, new Function<People, String>() {
public String apply(People person) {
return person.getName();
}
});

关于java - 如何获取我的对象的特定属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20455681/

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