繁体   English   中英

如何打印此流?

[英]How do I print out this 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

您需要将此表达式分配给某个列表,如下所示,

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

List使用foreach()方法

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

这个例子会给你一个想法,

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

}

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

当输出一些没有实现toString() ,java将只以不可读的Class$Subclass@LocationInMemory格式输出它,这对它没有多大帮助。

您可以利用Stream.peek打印清单lastName的S- author S上方的50age如下:

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具有基于Stream类型的返回类型,而forEach是无效的 : -

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM