Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改以获取Java SE 9及其后续版本中更新的语言特性的摘要。
请参阅JDK发布说明以获取有关所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息。
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规范了解操作是中间操作还是终端操作的信息是一个很好的习惯。 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。