java8的list, map简化操作

一: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());
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前

java8新特性

Stream将List转换为Map,使用Collectors.toMap方法进行转换背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象1、指定keyvalue,value是对象中的某个属性值。 Map<Integer,StringuserMap1userList.str

​一篇文章总结一下Python库中关于时间的常见操作

前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在