3 回答

TA貢獻1757條經驗 獲得超7個贊
您需要將此表達式分配給這樣的列表,
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());
除了收集器類型的空對象外,沒有什么可打印的,這就是你看到這個的原因,
java.util.stream.Collectors$CollectorImpl@4ec6a292

TA貢獻1789條經驗 獲得超8個贊
使用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);

TA貢獻1784條經驗 獲得超8個贊
您可以使用Stream.peek打印50歲以上lastName的authors列表,如下所示: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,它們都是終端操作,只是 collect 具有基于 Stream 類型的返回類型,而 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
}
添加回答
舉報