Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
forEach 聚合操作与增强的 for 语句或迭代器的不同之处。
forEach 聚合操作允许系统决定迭代发生的“方式”。使用聚合操作可以让你专注于“什么”而不是“如何”。
double average = roster
.stream()
.filter(p -> p.getGender() == Person.Sex.MALE)
.mapToInt(Person::getAge)
.average()
.getAsDouble();
filter,mapToInt average average 返回 OptionalDouble。然后在该返回的对象上调用 getAsDouble 方法。有关操作是中间操作还是终端操作的信息,参阅 API Specification 始终是一个好主意。
p -> p.getGender() == Person.Sex.MALE 是什么样的例子?
Person::getAge 是什么样的例子?
Stream.reduce 方法和 Stream.collect 方法之间的一个重要区别。
Stream.reduce 在处理元素时始终会创建一个新值。Stream.collect 修改(或改变)现有值。
List 中,Stream.reduce 或 Stream.collect 哪个是最适合使用的操作?
List。
List<String> namesOfMaleMembersCollect = roster
.stream()
.filter(p -> p.getGender() == Person.Sex.MALE)
.map(p -> p.getName())
.collect(Collectors.toList());
parallelStream() 而不是 stream() 来获取并行流。
for 语句写为具有 lambda 表达式的管道。提示:使用 filter 中间操作和 forEach 终端操作。
for (Person p : roster) {
if (p.getGender() == Person.Sex.MALE) {
System.out.println(p.getName());
}
}
roster
.stream()
.filter(e -> e.getGender() == Person.Sex.MALE)
.forEach(e -> System.out.println(e.getName());
for 循环。提示:按顺序调用 filter,sorted 和 collect 操作的管道。
List<Album> favs = new ArrayList<>();
for (Album a : albums) {
boolean hasFavorite = false;
for (Track t : a.tracks) {
if (t.rating >= 4) {
hasFavorite = true;
break;
}
}
if (hasFavorite)
favs.add(a);
}
Collections.sort(favs, new Comparator<Album>() {
public int compare(Album a1, Album a2) {
return a1.name.compareTo(a2.name);
}});
List<Album> sortedFavs =
albums.stream()
.filter(a -> a.tracks.anyMatch(t -> (t.rating >= 4)))
.sorted(Comparator.comparing(a -> a.name))
.collect(Collectors.toList());
anyMatch),排序和集合符合我们标准的专辑到 List。Comparator.comparing() 方法接受一个提取 Comparable 排序键的函数,并返回一个 Comparator,用于比较该键。