Лучший способ избежать избыточного кода при создании нескольких новых объектов - PullRequest
1 голос
/ 20 марта 2020

Я пытаюсь разобраться с функционалом Java и потоками.

Например, один из способов создания нового объекта с небольшой разницей в имени:

List<NewTopic> topicList = new ArrayList<NewTopic>();

for (Event event : events) {
           System.out.println(events.toString());
           topicList.add(new NewTopic(event.getName() + "-in", 1, (short) 1)); 
           topicList.add(new NewTopic(event.getName() + "-out", 1, (short) 1)); 
           topicList.add(new NewTopic(event.getName() + "-err", 1, (short) 1)); 
}

Вместо того, чтобы поместить три объекта в три строки, вложенный l oop с дополнительный массив строк ("in", "out", "err") был бы возможен.

Теперь с потоками возможно что-то вроде этого:

List<NewTopic> topicList = new ArrayList<NewTopic>();
String[] topicNames = {"-in", "-out", "-err"};

events.forEach(
       event -> Arrays.stream(topicNames).forEach(
                ending -> topicList.add(
                       new NewTopic(event.getName()
                               + ending, 1, (short) 1)
                    )
           )
);        

Есть еще элегантный + более короткий способ сделать это?

Спасибо!

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Да, вы можете сделать это, используя flatMap и Arrays.stream

List<NewTopic> topicList = events.stream()
        .flatMap(event -> Arrays.stream(topicNames)
                .map(tn -> new NewTopic(event.getName() + tn, 1, (short) 1)))
        .collect(Collectors.toList());
1 голос
/ 20 марта 2020

Вы были близки, вместо использования foreach для добавления к существующему List вы должны использовать Collector:

String[] topicNames = {"-in", "-out", "-err"};
List<NewTopic> topicList = events.stream()
    .flatMap(event -> Arrays.stream(topicNames)
        .map(ending -> event.getName() + ending)
    )
    .map(name -> new NewTopic(name, 1, (short) 1))
    .collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...