Java 等效于 C# Linq 中的 Where 子句

Posted

技术标签:

【中文标题】Java 等效于 C# Linq 中的 Where 子句【英文标题】:Java equivalent of Where Clause in C# Linq 【发布时间】: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 的可能重复项 【参考方案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 引入的,(在撰写本文时)尚未得到支持(请参阅 ***.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

以上是关于Java 等效于 C# Linq 中的 Where 子句的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的 Jaxb 等效项

C# 中的 Jaxb 等效项

等效于链式 LINQ 扩展方法调用中的 'let' 关键字的代码

等效于链式 LINQ 扩展方法调用中的 'let' 关键字的代码

等效于 C# LINQ Select 的 Javascript

JavaScript 等效于 C# LINQ 或其他获取数据的方式 [关闭]