使用Streams将列表对象复制到具有修改内容的另一个列表对象

时间:2019-07-05 16:02:52

标签: java-8 java-stream

我想使用流到我的列表中的大写书名

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 而不是 List --------- [JAVA,SPRING,WEBSERVICES]

    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 :(得分:0)

如果您只想更新现有列表,则可以使用.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());

答案 1 :(得分:0)

您的评论阐明了您的需求:

  

我应该更清楚了。这段代码正在运行,但是得到   我的书名清单。我想用书代替清单   大写标题

您甚至将所需的返回类型声明为List<Book>,而不是List<String>

所以让我们从这里开始:

更改

List<String> updateList

收件人

List<Book> updateList

然后,要实际返回书籍列表,.map()方法中的每个迭代都必须返回该迭代的Book对象。但是,在此之前,该操作必须在该Book上将Name成员设置为大写。

更改 .map()

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

收件人

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

然后将为您提供一个List<Book>,其中包含大写的标题。

您可以在这里找到有效的版本:https://repl.it/@randycasburn/StreamEdit

答案 2 :(得分:0)

已经给出了正确的答案,以便指出如果将流与方法引用功能结合使用,代码看起来会更漂亮(只是个趣味问题)。

让我举例说明:

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());
  }

}