Lambda
Lambda引用的是值,不是变量,所以,lambda中引用变量,必须是final变量或者既成事实上的final变量
Stream
collect(toList())
collect(toList()) 方法由 Stream 里的值生成一个列表, 是一个及早求值操作
List<String> collected = Stream.of("a", "b", "c").collect(Collectors.toList());
map
将流中一种类型的值转变为另一种类型的值得流用map
//for
List<String> list =new ArrayList<>() ;
for (String string:asList("a", "ab", "hello")){
list.add(string.toUpperCase());
}
//lambda
List<String> collected = Stream.of("a", "ab", "hello").map(string -> string.toUpperCase()) .collect(toList())
filter
遍历数据并检查其中的元素时用filter
//for
List<String> list =new ArrayList<>() ;
for (String string:asList("a", "ab", "hello")){
if (string.startsWith("a")){
list.add(string);
}
}
//lambda
List<String> a = Stream.of("a", "ab", "hello").filter(string -> string.startsWith("a")).collect(toList());
flatmap
flatMap 方法可用 Stream 替换值, 然后将多个 Stream 连接成一个 Stream
List<Integer> collect1 = Stream.of(asList(1, 2, 3), asList(4, 5, 6))
.flatMap(numbers -> numbers.stream()).collect(Collectors.toList());
max和min
Stream 上常用的操作之一是求最大值和最小值
Integer min = Stream.of(1, 2, 3)
.min(Comparator.comparing(Integer::intValue)).get();
Integer max = Stream.of(1, 2, 3)
.max(Comparator.comparing(s -> s)).get();
Reduce
reduce 操作可以实现从一组值中生成一个值。 在上述例子中用到的 count、 min 和 max 方法, 因为常用而被纳入标准库中。 事实上, 这些方法都是 reduce 操作。reduce 操作可以实现从一组值中生成一个值。 在上述例子中用到的 count、 min 和 max 方法, 因为常用而被纳入标准库中。 事实上, 这些方法都是 reduce 操作。
使用reduce求和
int acc=0;
for (int ele:asList(1,2,3)){
acc+=ele;
}
//等价于
Integer reduce = Stream.of(1, 2, 3).reduce(0, (acc, ele) -> acc + ele);
组合练习
flatmap也用于将一个list转为另一个list,如重构以下代码
public Set<String> findLongTracks (List < Album > albums) {
Set<String> trackNames = new HashSet<>();
for (Album album : albums) {
for (Track track : album.getTrackList()) { if (track.getLength() > 60) {
String name = track.getName();
trackNames.add(name);
}
}
}
return trackNames;
}
重构后的代码
public Set<String> findLongTracks (List < Album > albums) {
return albums.Stream()
.flatmap(album->album.getTrackList())
.filter(track->track.getLength>0)
.map(track->track.getName())
.collect(toSet())
}