在C++中,我可以使用带有谓词的
find_if
函数在容器中查找元素。在Java中有类似的方法吗?集合上的contains
方法使用equals并且不能被参数化。find_if
函数在容器中查找元素。在Java中有类似的方法吗?集合上的contains
方法使用equals并且不能被参数化。您可以使用Google Collections中的Predicate。这里是tutorial和其中的一个示例:
final Predicate<Car> expensiveCar = new Predicate<Car>() {
public boolean apply(Car car) {
return car.price > 50000;
}
}
List<Car> cars = Lists.newArrayList();
cars.add(new Car("Ford Taurus", 20000));
cars.add(new Car("Tesla", 90000));
cars.add(new Car("Toyota Camry", 25000));
cars.add(new Car("McClaren F1", 600000));
final List<Car> premiumCars =
Lists.immutableList(Iterables.filter(cars, expensiveCar));
你还可以查看这个主题:最佳的集合过滤方式是什么?
Iterables.find
将是最佳解决方案。 - Roman bool isOdd (int i) {
return i % 2 != 0;
}
...
vector<int> myvector;
vector<int>::iterator it;
myvector.push_back(10);
myvector.push_back(25);
myvector.push_back(40);
myvector.push_back(55);
it = find_if (myvector.begin(), myvector.end(), isOdd);
cout << "The first odd value is " << *it << endl;
List<Integer> myList = Arrays.asList(10, 25, 40, 55);
List<Integer> oddNums = (List<Integer>) CollectionUtils.select(myList,
new Predicate<Integer>() {
public boolean apply(Integer i) {
return i % 2 != 0;
}
}
);
System.out.println("The first odd value is "+oddNums.get(0));
find
,上述代码可以重写为:List<Integer> myList = Arrays.asList(10, 25, 40, 55);
Integer firstOdd = (Integer) CollectionUtils.find(myList,
new Predicate<Integer>() {
public boolean apply(Integer i) {
return i % 2 == 1;
}
}
);
System.out.println("The first odd value is "+firstOdd);
List<Car> premiumCars = new ArrayList();
for(Car car: cars)
if(car.price > 50000)
premiumCars.add(car);
List peopleOver30 = new ArrayList();
for(Person person: people)
if(person.age > 30)
peopleOver30.add(person);
Integer firstOdd = null;
for(int i: myList)
if(i % 2 == 1) {
firstOdd = i;
break;
}
函数式编程可能更符合您的开发背景,但这并不意味着它是在Java中表达这一点的自然或最简单的方式。Java 7 可能会改变这一点....
removeIf()
方法,它可以根据特定谓词从集合中删除元素。但是我们没有find_if
方法。不过,我们可以使用流API来实现它。List<Integer> list = Arrays.asList(20,35,50,654);
int result = list.stream().filter(i-> i%2!=0).findFirst().orElse(0).intValue();
System.out.println(result);
通过使用lambdaj,您可以以非常可读的方式轻松过滤Java集合。例如以下语句:
select(persons, having(on(Person.class).getAge(), greaterThan(30)));
选择列表中所有年龄大于30岁的人。