gpt4 book ai didi

java - 如何按类型动态创建通用的 lambda 实现?

转载 作者:行者123 更新时间:2023-11-29 07:27:31 25 4
gpt4 key购买 nike

比如我有课

public class Human {

private String name;

...
}

我想实现这样的东西:

(1)

List<Human> humans =  initHumans();
Equals<Human> humanEquals = new Equals<>();
Predicate<Human> filter = humanEquals.filter("name", "John");
List<Human> filteredHumans = humans
.stream()
.filter(filter)
.collect(Collectors.toList());

等于:

public class Equals<T> extends AbstractPredicate<T> {

public java.util.function.Predicate<T> filter(String fieldName, String fieldValue) {
....
}
}

是否可以实现过滤器方法来提供 (1) 行为?

我想像这样返回一个Predicate:

Predicate<Human> predicate = human -> human.getName().equals("John");

同样适用于其他类:

Predicate<Car> filter = humanEquals.filter("color", "red");
//like this:
Predicate<Car> predicate= human -> human.getColor().equals("red");

最佳答案

是的,这可以通过反射来实现:

public static <T> Predicate<T> filter(Class<T> clazz, String fieldName, Object fieldValue) {
// 1
return (T instance) -> {
try {
final Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);

return fieldValue.equals(field.get(instance));
} catch (NoSuchFieldException | IllegalAccessException e) {
// 2
}
return false;
};
}
  • 我做了一个方法static因为我不知道 AbstractPredicate 是什么是什么以及为什么需要创建实用程序类的实例。
  • 我在不使用 getter 的情况下直接从字段中获取值 - 我们应该遵守什么命名约定? (可能会改进)

用途是:

final Predicate<Human> filter = Equals.filter(Human.class, "name", "John");

System.out.println(filter.test(new Human("John"))); // true
System.out.println(filter.test(new Human("Andrew"))); // false

还有几个问题我们需要思考——验证参数(1),处理异常(2)。


另一个选项可以使用 Function<T, E>提供对 getter 的引用:

public static <T, E> Predicate<T> filter(Function<T, E> supplier, E value) {
return (T instance) -> supplier.apply(instance).equals(value);
}

使用示例:

final Predicate<Human> predicate = Equals.filter(Human::getName, "John");

System.out.println(predicate.test(new Human("John"))); // true
System.out.println(predicate.test(new Human("Andrew"))); // false

关于java - 如何按类型动态创建通用的 lambda 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48853151/

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