【问题标题】:Java equivalent of Where Clause in C# LinqJava 等效于 C# Linq 中的 Where 子句
【发布时间】:2015-07-13 11:20:00
【问题描述】:

我可以在 C# 中做到这一点:

int CheetahNumber = 77;
Animal Cheetah = Model.Animals
   .Where(e => e.AnimalNo.Equals(CheetahNumber))
   .FirstOrDefault();

例如在 Java 中我有 ArrayList<Animal> Animals

如何查询这样的 ArrayList?谢谢。

【问题讨论】:

  • 据我所知,Java 中没有等效的 LINQ。
  • ArrayList filter 的可能重复项

标签: java lambda


【解决方案1】:

Java 8 引入了Stream API,它允许与 Linq 中的构造类似。

例如,您的查询可以表达为:

int cheetahNumber = 77;

Animal cheetah = animals.stream()
  .filter((animal) -> animal.getNumber() == cheetahNumber)
  .findFirst()
  .orElse(Animal.DEFAULT);

如果存在默认值,您显然需要锻炼,在这种情况下这似乎很奇怪,但我已经展示了它,因为这就是您问题中的代码所做的。

【讨论】:

  • 一个问题:我可以在Android上使用它吗?
  • Stream API 是随 Java 8 引入的,(在撰写本文时)尚未得到支持(请参阅 stackoverflow.com/questions/23318109/…
  • 这里的默认值其实是null——所有类类型的默认值。由于 C# 允许原语作为泛型类型参数(没有装箱!!),名称 FirstOrDefault 暗示对于值类型,除了 null 之外,您还会得到一些东西,例如 int0 和 @ 987654329@,使用其默认(无参数)构造函数创建的该结构的实例。除非它是一个可以为空的值类型,在这种情况下你会再次得到null,因为它实际上等价于Nullable<primitiveType>
【解决方案2】:

您可以使用流来尝试:

public String getFirstDog(List<Animal> animals) {
    Animal defaultDog = new Dog();
    Animal animal = animalNames.stream(). //get a stream of all animals 
        filter((s) -> s.name.equals("Dog")).findFirst(). //Filter for dogs and find the first one
        orElseGet(() -> defaultDog ); //If no dog available return an default animal.
                                        //You can omit this line.
    return animal;
}

【讨论】:

    【解决方案3】:

    尽管 Java 没有为您提供 LINQ 相等构造,但您可以在一定程度上实现 Java 8 流构造的 LINQ 操作。

    比如一个

    List<String> items = new ArrayList<String>();
    items.add("one"); 
    items.add("two");
    items.add("three");
    
    Stream<String> stream = items.stream();  
    stream.filter( item ->  item.startsWith("o") );
    

    看看java8 stream

    【讨论】:

    • 谢谢。如果 item 具有 itemID、itemName 等属性,你能告诉我如何访问 item 的属性吗?
    • 您可能必须使用对象的 getter
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多