Java-эквивалент предложения Where в С# Linq

Я могу сделать это в С#:

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

Например, в Java у меня есть ArrayList<Animal> Animals

Как я могу запросить такой ArrayList? Спасибо.

Ответ 1

В Java 8 представлен Stream API, который позволяет аналогичным конструкциям использовать те, что содержатся в Linq.

Например, ваш запрос может быть выражен:

int cheetahNumber = 77;

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

Очевидно, что вам нужно тренироваться, если по умолчанию существует, что кажется странным в этом случае, но я показал его, потому что это то, что делает код в вашем вопросе.

Ответ 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 равные конструкции, но вы можете достичь некоторого уровня, какие операции LINQ с потоком Java 8 создаются.

например, один

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