Java中有类似find_if的东西吗? 在C++中,我可以使用 FIDION,如果用谓词在容器中找到元素。Java中有类似的东西吗?集合上的包含方法使用equals,无法参数化。

Java中有类似find_if的东西吗? 在C++中,我可以使用 FIDION,如果用谓词在容器中找到元素。Java中有类似的东西吗?集合上的包含方法使用equals,无法参数化。,java,collections,Java,Collections,您可以从中使用。以下是示例和示例: 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)

您可以从中使用。以下是示例和示例:

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));
final Predicate expensiveCar=new Predicate(){
公共布尔应用(汽车){
返回车辆。价格>50000;
}
}
List cars=Lists.newArrayList();
添加(新车(“福特金牛座”,20000);
新增(新车(“特斯拉”,90000辆));
添加(新车(“丰田凯美瑞”,25000);
添加(新车(“麦克拉伦F1”,600000辆));
最后名单=
Lists.immutableList(Iterables.filter(cars,expensiveCar));
您还可以查看以下线程:

您可以从Apache Commons使用

例如,下面的C++代码

  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;
通过使用,您可以以非常可读的方式轻松地过滤java集合。例如,下面的语句:

select(persons, having(on(Person.class).getAge(), greaterThan(30)));

选择列表中所有30岁以上的人。

问题在于,使用find\u if之类的方法会使代码更易于编写和阅读。然而,IMHO Java不适合使用函数表示法,而且大多数情况下,只编写一个自然循环更清晰、更简单。i、 代码较短,不需要了解大多数人不使用的库。如果此功能是内置的且Java支持闭包(如 看来Java7将会)然后使用谓词和函数方法会更有意义

复杂度的一个度量是计算符号的数量(将开/闭括号计算为一个)。使用这种复杂度度量,大多数基于谓词的解决方案都有更多的符号,并且可能更复杂,开发人员更难读取/维护

在@Roman给出的示例中,有15个符号。在循环示例中,有10个符号

List<Car> premiumCars = new ArrayList();
for(Car car: cars)
   if(car.price > 50000)
      premiumCars.add(car);
以@Rahul G-我讨厌独角兽的最后一个例子为例,共有13个符号。在循环示例中,有8个符号

Integer firstOdd = null;
for(int i: myList) 
    if(i % 2 == 1) {
       firstOdd = i;
       break;
    } 

函数式编程可能对您更有意义,因为这是您的开发背景,但这并不意味着它是用Java表达这一点的自然或最简单的方式。Java 7可能会改变这一点

在Java8中,我们有
removeIf()
,它使用特定谓词从集合中删除元素。但是我们没有类似于
find\u 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);
List-List=Arrays.asList(20,35,50654);
int result=list.stream().filter(i->i%2!=0).findFirst().orElse(0).intValue();
系统输出打印项次(结果);

chk也会想到谓词,请看一看,尤其是谓词和函数接口。CollectionUtils.find()更接近;它只返回第一个匹配的元素。@Matthew:谢谢。更新了答案以包含该内容。除非您已经使用java 1.4.2或更低版本,否则不要使用apache集合。@kts:Point noted。仍然不是否决IMO的充分理由。与任何重要事项无关,请注意您的isOdd谓词已被破坏。:)
Iterables.find
()将只提供第一个匹配元素。@Matthew Flaschen:是的,如果我们只需要获得至少一个对应项,那么
Iterables.find
将是最好的解决方案。我想你使用的是一个非常旧的谷歌收藏预发布快照!如果您想将过滤后的iterable复制到不可变列表中(而不是直接循环),请使用ImmutableList.copyOf()。@Kevin Bourrillion:您可能是对的,但这只是教程中的一段代码。它可以作为一个良好的起点,而不是从这里复制并粘贴到程序中的代码。我还发现当前的GoogleCollectionsAPI和教程中使用的版本存在一些差异。但是所有的概念都是真实的。彼得,回答得好。我尝试在Java中使用函数式风格,也发现它使代码更复杂,更难理解。
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;
    } 
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);