java8的list, map简化操作

Wesley13
• 阅读 707

一:stream用法

    Stream类型有两种类型的方法

中间操作(Intermediate Operation),结束操作(Terminal Operation)

      Stream之所以“懒”的秘密也在于每次在使用Stream时,都会连接多个中间操作,并在最后附上一个结束操作。 像map()和filter()这样的方法是中间操作,在调用它们时,会立即返回另一个Stream对象。而对于reduce()及findFirst()这样的方法,它们是结束操作,在调用它们时才会执行真正的操作来获取需要的值。

List names = Arrays.asList("Brad", "Kate", "Kim", "Jack", "Joe", "Mike", "Susan", "George", "Robert", "Julia", "Parker", "Benson");

    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 statuses 

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());
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java8新特性
Stream将List转换为Map,使用Collectors.toMap方法进行转换背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象1、指定keyvalue,value是对象中的某个属性值。 Map<Integer,StringuserMap1userList.str
Karen110 Karen110
3年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
Java8并行http请求加快访问速度
背景1.通常我们在获取到一个list列表后需要一个挨着一个的进行遍历处理数据,如果每次处理都需要长时间操作,那整个流程下来时间就是每一次处理时间的总和。2.Java8的stream接口极大地减少了for循环写法的复杂性,stream提供了map/reduce/collect等一系列聚合接口,还支持并发操作:parallelStream。例子
Wesley13 Wesley13
3年前
Java学习:Stream流式思想
Stream流Java8API添加了一种新的机制——Stream(流)。Stream和IO流不是一回事。流式思想:像生产流水线一样,一个操作接一个操作。使用Stream流的步骤:数据源→转换成流→操作1→操作2→……数据源(source):可以是集合、数组等。St
Wesley13 Wesley13
3年前
Java 8新特性之Stream 概念
Java8中有两大最为重要的改变。第一个是Lambda表达式;另外一个则是StreamAPI(java.util.stream.\)。Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用StreamAPI对集合数据进行操作,就类似于使用SQL执行
Wesley13 Wesley13
3年前
JAVA8流操作
Stream的三个操作步骤:1创建Stream2中间操作3终止操作packageairycode_java8.nice6;importairycode_java8.nice1.Employee;importorg.junit.Test;importjava
京东云开发者 京东云开发者
10个月前
使用Flink完成流数据统计 | 京东云技术团队
Flink程序构建的基本单元是stream和transformation(DataSet实质上也是stream)。stream是一个中间结果数据,transformation对数据的加工和操作,该操作以一个或多个stream为输入,计算输出一个或多个stream为结果,最后可以sink来存储数据。