如何打印此信息流?

时间:2018-11-10 19:56:36

标签: java java-8 java-stream

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

您需要将此表达式分配给这样的列表,

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

此示例将为您提供一个想法,

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

}

答案 3 :(得分:1)

您需要使用Arrays.toString(SomeArray)或其他一些方法,例如for循环。

当输出未实现toString()的内容时,java只会以Class$Subclass@LocationInMemory的不可读格式输出它,这并没有太大帮助。

答案 4 :(得分:1)

您可以使用Stream.peek来打印lastName 50 年以上的authorage的{​​{1}}个列表,如下所示:

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,它们都是终端操作,只是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
}