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
之外,您还会得到一些东西,例如 int
、0
和 @ 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 子句的主要内容,如果未能解决你的问题,请参考以下文章
等效于链式 LINQ 扩展方法调用中的 'let' 关键字的代码
等效于链式 LINQ 扩展方法调用中的 'let' 关键字的代码