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
。