一:stream用法
Stream类型有两种类型的方法
中间操作(Intermediate Operation),结束操作(Terminal Operation)
Stream之所以“懒”的秘密也在于每次在使用Stream时,都会连接多个中间操作,并在最后附上一个结束操作。 像map()和filter()这样的方法是中间操作,在调用它们时,会立即返回另一个Stream对象。而对于reduce()及findFirst()这样的方法,它们是结束操作,在调用它们时才会执行真正的操作来获取需要的值。
List
final String firstNameWith3Letters = names.stream()
.filter(name -> length(name) == 3)
.map(name -> toUpper(name))
.findFirst()
.get();
你可能认为以上的代码会对names集合进行很多操作,比如首先遍历一次集合得到长度为3的所有名字,再遍历一次filter得到的集合,将名字转换为大写。最后再从大写名字的集合中找到第一个并返回
可是实际情况并不是这样,不要忘了Stream可是非常“懒”的,它不会执行任何多余的操作
实际输出结果是
getting length for Brad
getting length for Kate
getting length for Kim
converting to uppercase: Kim
KIM
当结束操作获得了它需要的答案时,整个计算过程就结束了。如果没有获得到答案,那么它会要求中间操作对更多的集合元素进行计算,直到找到答案或者整个集合被处理完毕。
JDK会将所有的中间操作合并成一个,这个过程被称为熔断操作(Fusing Operation)。因此,在最坏的情况下(即集合中没有符合要求的元素),集合也只会被遍历一次,而不会像我们想象的那样执行了多次遍历。
1:Arrays.Stream(Collect
Collection<BaseEnumModel> enums = Arrays.stream(DemandSourceTypeEnum.values()).map(BaseEnumModel::new).collect(Collectors.toList());
public enum DemandSourceTypeEnum implements CreamsEnum {
DOOR_TO_DOOR("上门"),
TELEPHONE("电话"),
AGENCY("中介");
private String desc;
DemandSourceTypeEnum(String desc) {
this.desc =desc;
}
public String getDesc() {
return desc;
}
}
public interface CreamsEnum{
String getDesc();
String name();
}
public class BaseEnumModel{
private String id;
private String name;
public String getId() {
return id;
}
public void setId(Stringid) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(Stringname) {
this.name =name;
}
public BaseEnumModel(CreamsEnum operation) {
this.id = operation.name();
this.name =operation.getDesc();
}
}
Stream可用使用的常用方法,map(mapToInt, mapToDouble),
2:对象映射
Collection
List<BaseEnumModel> statuses =statuses.stream().map(status -> new BaseEnumModel(DemandStatusEnum.valueOf(status))).collect(Collectors.toList());
List<Long> longList = Arrays.stream(roomIdsString.split(",")).map(Long::parseLong).collect(Collectors.toList());
3:map的遍历
unitMap.forEach((k, v) -> {
......
});
Map<Long, Long> mapSortByKey = map.entrySet().stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,(e1, e2) -> e1, LinkedHashMap::new));
4:filter操作
models.stream().filter(model -> model.getName().equals(name)).collect(Collectors.toList());
regions.stream().filter(region -> Objects.equals(region.getId(), model.getId())).collect(Collectors.toList());