Arhn - архитектура программирования

Как я могу объединить строковые элементы из списка в java8 на основе их количества?

У меня есть следующая структура:

class MyClass {
    String name;
    String descr;

    public String getName() {
        return name;
    }
}

Теперь у меня есть список этих объектов, и я хочу напечатать имя из объекта выше, если список содержит какие-либо из этих элементов.

Это мой код до сих пор:

List<MyClass> list = getList();

if (list != null && list.size() > 0) {
    System.out.println(list.get(0).getName());
} else {
    System.out.println("list is empty");
}

Это будет работать, когда list содержит только один элемент. Теперь мне нужно его улучшить и рассмотреть пример, когда элементов больше одного - в этом случае мне нужно вывести все имена через запятую.

Например, вывод должен быть:

Когда есть 3 элемента:

name1,name2,name3 

когда есть один элемент:

name1

а когда нет:

list is empty

каков наиболее эффективный способ его реализации?

31.01.2018

  • Хольгер недавно опубликовал отличный способ сделать это... но он не будет компилироваться компилятором eclipse; кроме того, это потрясающе stackoverflow.com/a/48281783/1059372 31.01.2018
  • @Eugene, это был особый случай изменения одноэлементного представления. Этот вопрос касается представления пустого потока, которое намного проще. 31.01.2018

Ответы:


1

Вы можете использовать Collectors.joining в сочетании с Collectors.collectingAndThen:

import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.joining;

...

String res = 
    list.stream()
        .map(c -> c.name)
        .collect(collectingAndThen(joining(","), s -> s.isEmpty() ? "list is empty" : s));

Если вы хотите принять во внимание вариант, когда список равен нулю, вы можете сделать:

String res = 
    Optional.ofNullable(list).map(l -> l.stream()...).orElse("list is empty");

но, честно говоря, я бы заранее использовал оператор if:

if(list == null || list.isEmpty()) { 
    return "list is empty"; 
} else { 
    return list.stream().map(c -> c.name).collect(joining(","));
}
31.01.2018
  • Мне нравится этот подход, не могли бы вы просто сказать мне, как я могу присвоить выходную строку переменной? Я хочу поместить его в какую-нибудь переменную, например String output, а затем использовать этот вывод где-то еще. Как я мог это сделать? 31.01.2018
  • еще одна вещь, хотя - что, если список равен нулю? Как я мог тогда поставить сообщение list is empty? 31.01.2018

  • 2

    Вы также можете использовать встроенный класс StringJoiner для упрощения кода следующим образом:

    StringJoiner joiner = new StringJoiner(",");
    joiner.setEmptyValue("list is empty");
    
    list.forEach(it -> joiner.add(it.getName()));
    
    System.out.println(joiner);
    
    31.01.2018
  • теперь это потрясающе! не знал о setEmptyValue 31.01.2018
  • @Eugene Я также недавно использовал его в своем собственном проекте :) 31.01.2018
  • @holi-java как насчет ситуации, когда список пуст? как я могу предотвратить это и вставить строку list is empty, когда это произойдет? 31.01.2018
  • @randomuser1 привет, ты можешь просто добавить if(list!=null) list.forEach(..). 31.01.2018
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..