Как распечатать этот поток? - PullRequest
0 голосов
/ 10 ноября 2018
library.stream()
             .map(book -> book.getAuthor())
             .filter(author -> author.getAge() >= 50)
             .map(Author::getLastName)
             .limit(10)
             .collect(Collectors.toList());

Как распечатать список? Я пробовал

System.out.println(Collectors.toList());

но это дает мне

 java.util.stream.Collectors$CollectorImpl@4ec6a292

Ответы [ 5 ]

0 голосов
/ 11 ноября 2018

Вы можете использовать Stream.peek , чтобы распечатать список lastName с author с выше 50 лет age следующим образом:

List<Book> library = List.of(new Book(new Author("overflow", 100)), 
                             new Book(new Author("stack", 80)), 
                             new Book(new Author("nullpointer", 49)));

// you were ignoring the result of collect
List<String> lastNames = library.stream()
            .map(Book::getAuthor)
            .filter(author -> author.getAge() >= 50)
            .map(Author::getLastName)
            .limit(10)
            .peek(System.out::println) // this would print "overflow" and "stack"
            .collect(Collectors.toList());

Кроме того, обратите внимание, что если вы хотите просто напечатать имена, а не хранить их, вы можете просто использовать forEach вместо collect, обе они являются терминальными операциями, поскольку сбор данных имеет тип возврата, основанный на Тип потока в то время как forEach равен void : -

library.stream()
       .map(Book::getAuthor)
       .filter(author -> author.getAge() >= 50)
       .map(Author::getLastName)
       .limit(10)
       .forEach(System.out::println);

Все вышеперечисленное, учитывая, что используемые объекты похожи на следующие

class Book {
    Author author;

    Book(Author author) {
        this.author = author;
    }

    // ... getters
}

class Author {
    String lastName;
    int age;

    Author(String lastName, int age) {
        this.lastName = lastName;
        this.age = age;
    }

    // ... getters
}
0 голосов
/ 10 ноября 2018

Вам нужно использовать Arrays.toString(SomeArray) или другой метод, например цикл for.

При выводе чего-то, что не реализует toString(), java будет просто выводить его в нечитаемом формате Class$Subclass@LocationInMemory, что не очень помогает.

0 голосов
/ 10 ноября 2018

Этот пример даст вам представление,

public class A {

    public static void main(String[] args) throws IOException {
        Stream<String> s = Stream.of("a", "b", "c");
        List<String> names = s.collect(Collectors.toList());
        System.out.println(names);
    }

}
0 голосов
/ 10 ноября 2018

Вам нужно либо присвоить это выражение некоторому списку, подобному этому,

List<String> lastNameList = library.stream()
             .map(book -> book.getAuthor())
             .filter(author -> author.getAge() >= 50)
             .map(Author::getLastName)
             .limit(10)
             .collect(Collectors.toList());

А затем распечатайте его, используя

System.out.println(lastNameList);

ИЛИ вы можете напечатать его прямо так,

System.out.println(library.stream()
             .map(book -> book.getAuthor())
             .filter(author -> author.getAge() >= 50)
             .map(Author::getLastName)
             .limit(10)
             .collect(Collectors.toList()));

Вы на самом деле делаете это,

System.out.println(Collectors.toList());

Которому нечего печатать, кроме пустого объекта типа Collectors, вот почему вы видите это,

java.util.stream.Collectors$CollectorImpl@4ec6a292
0 голосов
/ 10 ноября 2018

Использовать foreach() метод в List

library.stream()
    .map(book -> book.getAuthor())
    .filter(author -> author.getAge() >= 50)
    .map(Author::getLastName)
    .limit(10)
    .forEach(System.out::println);

Если вы хотите напечатать собранный список, вот пример

List<Integer> l = new ArrayList<>();
l.add(10);
l.add(20);
l.forEach(System.out::println);
...