Оптимизация потоковой поддержки операций Java - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть ArrayNode, похожий на эти имена "results":

[{
"subjectName": "Eclipse",
"code": "EC1",
"states": [
    {
        "subjectName": "LunorEx1",
        "code":"E1"
    },
    {
        "subjectName": "LunorEx2",
        "code":"E2"
    },
    {
        "subjectName": "Expus LunorEx3 ", 
        "code":"E6"
    }]
},
{
"subjectName": "Lasena",
"code": "LS1",
"states": [
    {
        "subjectName": "SunorEx1",
        "code":"S1"
    },
    {
        "subjectName": "SunorEx2",
        "code":"S2"
    }]
}, {
"subjectName": "Gilesh",
"code": "GL2",
"states": [ ]
}]

эта переменная общедоступна.

Используя Java 8, я хочу иметь возможность проверить, существует ли, например, subjectName, равный «Eclipse», и код, равный «EC1», если он существует, то я хочу искать в его состояниях json и находить состояние, которое имеет, например, subjectName равно "LunorEx1" и код "E1", если все они найдены, я хочу вернуть true

private static boolean subjectValidation( String parentSubjectName, String parentCode, String childSubjectName, String childCode){

    boolean valid = false;
    try {
            JsonNode subjectData = StreamSupport.stream(results.spliterator(), true)
                    .filter(c -> c.get("subjectName").asText().equals(parentSubjectName) &&
                            c.get("code").asText().equals(parentCode) )
                    .collect(Collectors.toList()).get(0);

            valid = StreamSupport.stream(subjectData.get("states").spliterator(), true)
                    .anyMatch(k ->  k.get("states").get("subjectName").asText().equals(childSubjectName) &&
                            k.get("states").get("code").asText().equals(childCode));



    } catch (Exception e) {
    }
    return valid;
}

Я хочу оптимизировать это, потому что у меня есть несколько массивов JSON с одинаковой структурой, и я делаю несколько похожих проверок .... и обрабатывать, когда первый поток ничего не возвращает. Может ли кто-нибудь помочь мне, дать несколько советов о том, как я могу сделать это лучше?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Я хотел бы принять во внимание, что subjectName и код не являются уникальными.

private static boolean subjectValidation(String parentSubjectName, String parentCode, String childSubjectName, String childCode) {

    try {
        return StreamSupport.stream(results.spliterator(), true)
            .filter(c -> hasSubject(c, parentSubjectName) && hasCode(c, parentCode))
            .flatmap(s -> StreamSupport.stream(s.get("states").spliterator(), true)
            .map(k -> k.get("states"))
            .anyMatch(k -> hasSubject(k, childSubjectName) && hasCode(k, childCode));
    } catch (Exception e) {
        return false;
    }
}

private static boolean hasSubject(JsonNode node, String value) {
    return fieldHasValue(node, "subjectName", value);
}

private static boolean hasCode(JsonNode node, String value) {
    return fieldHasValue(node, "code", value);
}

private static boolean fieldHasValue(JsonNode node, String field, String value) {
    return node.get(field).asText().equals(value);
}

Вероятно, должна быть лучшая обработка исключений, но она должна работать.

Если вы хотите еще больше обобщить это, я бы сделал функцию, которая позволит вам выполнять эти проверки на лету просто на основе установки переменных для «кода», «имени субъекта» и «состояния»

0 голосов
/ 14 ноября 2018

Я думал, что это может выглядеть так:

private static boolean subjectValidation(String parentSubjectName, String parentCode, String childSubjectName,
        String childCode) {

    boolean valid = false;
    try {
        Optional<JsonNode> subjectData = StreamSupport.stream(results.spliterator(), true)
                .filter(c -> exists(c, "subjectName", parentSubjectName) && exists(c, "code", parentCode))
                .findFirst();

        if (subjectData.isPresent()) {
            valid = StreamSupport.stream(subjectData.get().get("states").spliterator(), true)
                    .anyMatch(k -> exists(k.get("states"), "subjectName", childSubjectName)
                            && exists(k.get("states"), "code", childCode));
        }

    } catch (Exception e) {
    }
    return valid;
}

private static boolean exists(JsonNode node, String nodeName, String value) {
    return node.get(nodeName).asText().equals(value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...