首页 > 解决方案 > 如何使用 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 解决这个问题?

标签: javacollectionsjava-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);

推荐阅读