копирование объекта списка в другой объект списка с измененным содержимым с использованием потоков - PullRequest
0 голосов
/ 05 июля 2019

Я хочу использовать потоки для названия книги в верхнем регистре в моем списке

List<Book> list = new ArrayList<Book>();
list.add(new Book("1", "Java", 10));
list.add(new Book("2", "Spring", 20));
list.add(new Book("3", "Webservices", 30));

Я хочу преобразовать регистр в название моей книги. Мой текущий подход дает мне Список вместо Список --------- [JAVA, ВЕСНА, ВЕБ-СЕРВИСЫ]

    package java8;

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
    import java.util.stream.IntStream;
    import java.util.stream.Stream;;

    public class StreamTest {

        public static void main(String s[]) {
            List<Book> list = new ArrayList<Book>();
            list.add(new Book("1", "Java", 10));
            list.add(new Book("2", "Spring", 20));
            list.add(new Book("3", "Webservices", 30));
            List<String> updateList = list.stream().map(str2 -> str2.getName().toUpperCase()).collect(Collectors.toList());            
System.out.println("--------- "+updateList);
        }
    }

Ответы [ 3 ]

0 голосов
/ 05 июля 2019

Ваш комментарий уточнил вашу потребность:

Я должен был быть более ясным. Этот кусок кода работает, но получает мне список названий книг. Я хочу список вместо с книгой Заголовок в верхнем регистре

Вы даже указываете желаемый тип возврата как List<Book> вместо List<String>.

Итак, начнем там:

Изменение

List<String> updateList

К

List<Book> updateList

Затем, чтобы фактически вернуть список книг, каждая итерация в методе .map() должна возвращать объект Book этой итерации. Но перед этим операция должна установить для элемента Name заглавные буквы в этой книге.

Изменение .map()

.map(str2 -> str2.getName().toUpperCase())

К

.map(str2 -> {str2.setName(str2.getName().toUpperCase()); return str2;})

Затем вы получите List<Book> с заглавными буквами.

Вы можете найти рабочую версию здесь: https://repl.it/@randycasburn/StreamEdit

0 голосов
/ 23 июля 2019

Правильные ответы уже были даны, поэтому просто укажем, что код выглядит намного красивее (дело вкуса), если использовать потоки в сочетании с функцией ссылки на метод.

позвольте мне проиллюстрировать:

class Foo {

  public List<Book> convertToBooksWithTitleInUpperCase(List<Book> books) {
       return books.stream()
                   // the means: "map" book to another object (another book in this case) by calling the conversion function "createBookWithTitleInUpperCase")  
                  .map(this::createBookWithTitleInUpperCase)
                  .collect(Collectors.toList());
  } 

  private Book createBookWithTitleInUpperCase(Book book) {
     return new Book(book.getId(), book.getTitle().toUpperCase());
  }

}

0 голосов
/ 05 июля 2019

Вы можете просто использовать .forEach(), если хотите просто обновить существующий список:

list.forEach(b -> b.setName(b.getName().toUpperCase()));

Если вы хотите создать новый список, вы можете использовать это:

List<Book> result = list.stream()
        .map(b -> new Book(b.getId(), b.getName().toUpperCase(), b.getSomething()))
        .collect(Collectors.toList());
...