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
答案 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 年以上的author
中age
的{{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
}