猿问

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

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

我想过滤一个java.util.Collection基于谓词。



鸿蒙传说
浏览 901回答 3
3回答

慕尼黑5688855

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

侃侃尔雅

“最好”的方式太宽泛了。是“最短”吗?“最快”?“可读性”?过滤到位还是进入另一个集合?最简单(但不是最易读)的方法是迭代它并使用Iterator.emove()方法:Iterator<Foo>&nbsp;it&nbsp;=&nbsp;col.iterator();while(&nbsp;it.hasNext()&nbsp;)&nbsp;{ &nbsp;&nbsp;Foo&nbsp;foo&nbsp;=&nbsp;it.next(); &nbsp;&nbsp;if(&nbsp;!condition(foo)&nbsp;)&nbsp;it.remove();}现在,为了使它更具可读性,您可以将其包装到实用程序方法中。然后创建一个IPredicate接口,创建该接口的匿名实现,并执行如下操作:CollectionUtils.filterInPlace(col, &nbsp;&nbsp;new&nbsp;IPredicate<Foo>(){ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;keepIt(Foo&nbsp;foo)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;foo.isBar(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;});其中filterInPlace()迭代集合并调用Predicate.memit()来了解是否将实例保存在集合中。我看不出只为这个任务引入第三方库的正当理由。
随时随地看视频慕课网APP

相关分类

Java
我要回答