为了账号安全,请及时绑定邮箱和手机立即绑定

过滤Java集合的最佳方法是什么?

过滤Java集合的最佳方法是什么?

鸿蒙传说 2019-06-03 15:58:56
过滤Java集合的最佳方法是什么?我想过滤一个java.util.Collection基于谓词。
查看完整描述

3 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

Java 8(2014)在一行代码中使用流和lambda解决这个问题:

List<Person> beerDrinkers = persons.stream()
    .filter(p -> p.getAge() > 16).collect(Collectors.toList());

这是一个补习.

使用Collection#removeIf若要修改已到位的集合,请执行以下操作。(注意:在这种情况下,谓词将删除满足谓词的对象):

persons.removeIf(p -> p.getAge() <= 16);

蓝达允许在不编写循环或内部类的情况下过滤集合:

List<Person> beerDrinkers = select(persons, having(on(Person.class).getAge(),
    greaterThan(16)));


查看完整回答
反对 回复 2019-06-03
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

“最好”的方式太宽泛了。是“最短”吗?“最快”?“可读性”?过滤到位还是进入另一个集合?

最简单(但不是最易读)的方法是迭代它并使用Iterator.emove()方法:

Iterator<Foo> it = col.iterator();while( it.hasNext() ) {
  Foo foo = it.next();
  if( !condition(foo) ) it.remove();}

现在,为了使它更具可读性,您可以将其包装到实用程序方法中。然后创建一个IPredicate接口,创建该接口的匿名实现,并执行如下操作:

CollectionUtils.filterInPlace(col,
  new IPredicate<Foo>(){
    public boolean keepIt(Foo foo) {
      return foo.isBar();
    }
  });

其中filterInPlace()迭代集合并调用Predicate.memit()来了解是否将实例保存在集合中。

我看不出只为这个任务引入第三方库的正当理由。


查看完整回答
反对 回复 2019-06-03
  • 3 回答
  • 0 关注
  • 900 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号