java - 如何使用 java 8 获取特定的类和属性
问题描述
我已经定义了以下一组数据
Response response = new Response();
List<ObjectTest> objList = new ArrayList<ObjectTest>();
objList.add(new ObjectTest(new Attributes(new FirstName("ab","1"),new LastName("hernandez","2"))));
objList.add(new ObjectTest(new Attributes(new FirstName("jose","1"),new LastName("perez","2"))));
objList.add(new ObjectTest(new Attributes(new FirstName("paco","2"),new LastName("jackson","2"))));
objList.add(new ObjectTest(new Attributes(new FirstName("pedro","1"),new LastName("herrera","2"))));
objList.add(new ObjectTest(new Attributes(new FirstName("juan","2"),new LastName("flores","2"))));
response.setObjectList(objList);
因此,根据用户选择的内容,我需要能够获取特定的类和属性,例如:
如果用户选择 [Attributes - FirstName - value],输出将是:ab jose paco pedro juan
如果用户选择 [Attributes - LastName- status],输出将是:2 2 2 2 2
这里的问题是我不知道如何在运行时获取特定的类。此外,主对象内部可以包含任意数量的类,例如 MainClass.ClassA.ClasstB.ClassX.classAttributeValue。我唯一知道的是最后一个值将是我必须采用的值,在这种情况下我必须打印 classAttributeValue 。任何想法如何使用 java 8 解决这个问题?
解决方案
假设您的类结构如下所示:
public static abstract class Attribute {
public final String value;
public final String status;
public Attribute(String value, String status) {
this.value = value;
this.status = status;
}
}
public static class FirstName extends Attribute {
public FirstName(String value, String status) {
super(value, status);
}
}
public static class LastName extends Attribute {
public LastName(String value, String status) {
super(value, status);
}
}
public static class Attributes {
public final FirstName firstName;
public final LastName lastName;
public Attributes(FirstName firstName, LastName lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
public static class ObjectTest {
public final Attributes attributes;
public ObjectTest(Attributes attributes) {
this.attributes = attributes;
}
}
java.util.function.Function
您可以为每个阶段定义访问器:
Function<ObjectTest, Attributes> attributes = t -> t.attributes;
Function<Attributes, FirstName> firstName = t -> t.firstName;
Function<Attributes, LastName> lastName = t -> t.lastName;
Function<Attribute, String> value = t -> t.value;
Function<Attribute, String> status = t -> t.status;
并像这样组合它们:
Function<ObjectTest, String> attributeFirstNameValue =
attributes.andThen(firstName).andThen(value);
Function<ObjectTest, String> attributeLastNameStatus =
attributes.andThen(lastName).andThen(status);
然后将组合访问器应用于列表:
objList.stream().map(attributeFirstNameValue).forEach(System.out::println);
objList.stream().map(attributeLastNameStatus).forEach(System.out::println);
推荐阅读
- java - 使用 maven 调用程序时如何获取构建状态?
- java - 序列化为JSON字符串时如何在mybatis中获取枚举描述
- kubernetes - kubectl apply -f ngx-dep.yaml 错误:验证“ngx-dep.yaml”时出错:验证数据时出错:
- python - 在 Python Tkinter 中使用图像的问题
- git - Eclipse Git 首选项:无法更改要使用的用户空间 .gitconfig
- python-3.x - Windows 10 无法识别 python 文件类型
- authentication - 需要支持“客户端凭据”授权类型的 OAuth2 服务器
- python - 仅当线程进入睡眠状态时,使用自定义套接字 recvall 函数才有效
- reactjs - Symfony React Cors 问题
- lua - 罗技/LGHUB Lua - 带中断的循环