java stream collect 后 从原集合中删除

Can Java 8 Streams operate on an item in a collection, and then remove it?

Java Streams允许我们采用 Collection ,并在其上使用stream()方法来接收其所有元素的流。其中包含许多有用的方法,例如filter()map()forEach(),这些方法使我们可以对内容使用lambda操作。

方法1:(我喜欢用)

使用partitioningBy收集器:

Map<Boolean, Set<Item>> map =
    set.stream()
       .collect(partitioningBy(Item::qualify, toSet()));

map.get(true).forEach(i -> ((Qualifier)i).operate());
set = map.get(false);

它可能会更有效,因为它避免了两次迭代该集合,一次用于过滤流,然后一次用于删除相应的元素。

方法2:removeIf
set.removeIf(item -> {
  boolean removeItem=item.qualify();
  if (removeItem){
    item.operate();
  }
  return removeItem;
});

如果item.operate()始终返回true,则可以非常简洁地进行操作。

set.removeIf(item -> item.qualify() && item.operate());

就阅读性,使用迭代器会更好。循环通常比流式解决方案更具可读性,即使它们更冗长。

方法3:filter

当然在 filter 中使用 也是可以得

set = set.stream().filter(item -> {
    if (item.qualify()) {
        ((Qualifier) item).operate();
        return false;
    }
    return true;
}).collect(Collectors.toSet());
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值