一:stream用法
Stream类型有两种类型的方法
中间操作(Intermediate Operation),结束操作(Terminal Operation)
Stream之所以“懒”的秘密也在于每次在使用Stream时,都会连接多个中间操作,并在最后附上一个结束操作。 像map()和filter()这样的方法是中间操作,在调用它们时,会立即返回另一个Stream对象。而对于reduce()及findFirst()这样的方法,它们是结束操作,在调用它们时才会执行真正的操作来获取需要的值。
List<String> names = Arrays.asList("Brad", "Kate", "Kim", "Jack", "Joe", "Mike", "Susan", "George", "Robert", "Julia", "Parker", "Benson");
1 final String firstNameWith3Letters = names.stream() 2 .filter(name -> length(name) == 3) 3 .map(name -> toUpper(name)) 4 .findFirst() 5 .get();
你可能认为以上的代码会对names集合进行很多操作,比如首先遍历一次集合得到长度为3的所有名字,再遍历一次filter得到的集合,将名字转换为大写。最后再从大写名字的集合中找到第一个并返回
可是实际情况并不是这样,不要忘了Stream可是非常“懒”的,它不会执行任何多余的操作
实际输出结果是
1getting length for Brad 2getting length for Kate 3getting length for Kim 4converting to uppercase: Kim 5KIM
当结束操作获得了它需要的答案时,整个计算过程就结束了。如果没有获得到答案,那么它会要求中间操作对更多的集合元素进行计算,直到找到答案或者整个集合被处理完毕。
JDK会将所有的中间操作合并成一个,这个过程被称为熔断操作(Fusing Operation)。因此,在最坏的情况下(即集合中没有符合要求的元素),集合也只会被遍历一次,而不会像我们想象的那样执行了多次遍历。
1:Arrays.Stream(Collect<T>)
1Collection<BaseEnumModel> enums = Arrays.stream(DemandSourceTypeEnum.values()).map(BaseEnumModel::new).collect(Collectors.toList()); 2public enum DemandSourceTypeEnum implements CreamsEnum { 3 DOOR_TO_DOOR("上门"), 4 TELEPHONE("电话"), 5 AGENCY("中介"); 6 private String desc; 7 8 DemandSourceTypeEnum(String desc) { 9 this.desc =desc; 10 } 11 12 public String getDesc() { 13 return desc; 14 } 15} 16 17public interface CreamsEnum{ 18 String getDesc(); 19 String name(); 20} 21 22public class BaseEnumModel{ 23 private String id; 24 private String name; 25 26 public String getId() { 27 return id; 28 } 29 30 public void setId(Stringid) { 31 this.id = id; 32 } 33 34 public String getName() { 35 return name; 36 } 37 38 public void setName(Stringname) { 39 this.name =name; 40 } 41 42 public BaseEnumModel(CreamsEnum operation) { 43 this.id = operation.name(); 44 this.name =operation.getDesc(); 45 } 46}
Stream可用使用的常用方法,map(mapToInt, mapToDouble),
2:对象映射
Collection<String> statuses
1List<BaseEnumModel> statuses =statuses.stream().map(status -> new BaseEnumModel(DemandStatusEnum.valueOf(status))).collect(Collectors.toList()); 2 3List<Long> longList = Arrays.stream(roomIdsString.split(",")).map(Long::parseLong).collect(Collectors.toList());
3:map的遍历
1unitMap.forEach((k, v) -> { 2 ...... 3}); 4 5Map<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操作
1models.stream().filter(model -> model.getName().equals(name)).collect(Collectors.toList()); 2 3regions.stream().filter(region -> Objects.equals(region.getId(), model.getId())).collect(Collectors.toList());