Как представить карту с Groovy collectMaps - PullRequest
0 голосов
/ 09 мая 2019

У меня есть Java-код, который выглядит следующим образом:

 for(MyClass myclassObject: input.classes()) {
        if(myclassObject.getName().equals("Tom")) {
            outputMap.put("output", myclassObject.getAge())
        }
    }

Как мне эффективно написать это с Groovy collectmap?

Я могу сделать input.classes().collectEntries["output":it.getAge()] Но как мне включить в него условие if?

Ответы [ 3 ]

1 голос
/ 09 мая 2019

вы можете использовать findAll, чтобы оставить только предметы в соответствии с условием

, а затем применить collectEntries для преобразования найденных предметов

@groovy.transform.ToString
class MyClass{
    int age
    String name
}

def classes = [
    new MyClass(age:11, name:'Tom'),
    new MyClass(age:12, name:'Jerry'),
]

classes.findAll{it.getName()=='Tom'}.collectEntries{ [output:it.getAge()] }
1 голос
/ 09 мая 2019

Поскольку ваша итоговая карта в любом случае сохраняет только одно значение, вы также можете просто сделать это:

input.classes().findResult { it.name == 'Tom' ? [output: it.age] : null }

, где findResult вернет первый элемент в classes(), для которогозакрытие:

{ it.name == 'Tom' ? [output: it.age] : null }

возвращает ненулевое значение.

Поскольку вы упомянули эффективность в своем вопросе: это более эффективно, чем проходить всю коллекцию с использованием collectEntries или findAll, поскольку findResult возвращает непосредственно при поиске первого экземпляра it.name == 'Tom'.

Какой путь действительно зависит от ваших требований.

1 голос
/ 09 мая 2019

collectEntries может принимать замыкание в качестве параметра.Вы можете применить свою логику внутри замыкания и убедиться, что вы возвращаете запись карты, когда условие проходит, и возвращаете пустую карту, если условие не выполняется.Поэтому;

input.classes().collectEntries { MyClass myClassObject ->
  myClassObject.name == 'Tom' ? ['output': myClassObject.getAge()] : [:]
}

Однако, с вашим подходом возникает оговорка.Поскольку вы используете ключ как output, а карта не допускает дублирование ключей, вы всегда получите последнюю запись на карте.Вы должны придумать лучший план, если это не ваше намерение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...