2015-07-13 15 views
8

Mogę to zrobić w C#:Java odpowiednik Gdzie Klauzula w C# LINQ

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

Na przykład w Javie Mam ArrayList<Animal> Animals

Jak mogę zapytać takiego ArrayList? Dzięki.

+1

Nie ma LINQ równoważne w Javie o ile wiem. –

+0

możliwy duplikat filtra [Filtr ArrayList] (http://stackoverflow.com/questions/9146224/arraylist-filter) –

Odpowiedz

19

Java 8 wprowadza Stream API który pozwala podobnych do tych konstruktów w Linq.

Zapytanie na przykład, może być wyrażona:

int cheetahNumber = 77; 

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

Będziesz oczywiście trzeba treningu jeśli domyślny istnieje, co wydaje się dziwne w tym przypadku, ale ja pokazano go bo to właśnie kod w twoim pytaniu.

+0

Jedno pytanie: czy mogę użyć tego w systemie Android? – jason

+1

Interfejs API Stream został wprowadzony przy użyciu języka Java 8, który (w chwili pisania tego tekstu) nie jest jeszcze obsługiwany (zobacz http://stackoverflow.com/questions/23318109/is-it-possible-to-use-java-8 -for-android-development) –

+0

Domyślnie tutaj jest 'null' - domyślnie dla wszystkich typów klas. Ponieważ C# zezwala na prymitywy jako typowe argumenty typu (bez boksowania !!), nazwa 'FirstOrDefault' wskazuje, że dla typów wartości dostaniesz coś oprócz' null' takich jak dla 'int',' 0' i dla ' struct', instancja tej struktury utworzona za pomocą jej domyślnego konstruktora (bez parametrów). Chyba że jest to wartość zerowa, w takim przypadku otrzymasz ponownie 'null', ponieważ jest to odpowiednik klasy' Nullable '. – ErikE

2

Mimo że Java nie zapewnia LINQ równych konstrukcji, ale można osiągnąć pewien poziom operacji LINQ z konstrukcjami strumienia Java 8.

takie jak jeden

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")); 

Spójrz na java8 stream

+0

Dzięki. Czy możesz mi powiedzieć, jak mogę osiągnąć właściwość przedmiotu, jeśli przedmiot ma właściwości takie jak itemID, itemName itp ..? – jason

+0

Być może będziesz musiał użyć obiektów pobierających obiekt. – kuhajeyan

3

Można spróbować go za pomocą strumieni:

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; 
}