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");

        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<T>)  

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<String> 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());

 

转载于:https://my.oschina.net/yjpfj1203/blog/747779

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值