Есть ли Java-эквивалент метода Javascript "some"? - PullRequest
7 голосов
/ 24 января 2012

У меня есть коллекция, и я хотел бы знать, соответствует ли хотя бы один элемент некоторому условию.По сути, то, что некоторые делает в JavaScript, я хотел бы сделать для коллекции!

Ответы [ 4 ]

18 голосов
/ 24 января 2012

Проверьте Guava * Iterables класс и его any() реализация.

Более или менее то же самое, что и в примере с коллекциями Commons в другом ответе, но обобщенно:

List<String> strings = Arrays.asList("ohai", "wat", "fuuuu", "kthxbai");
boolean well = Iterables.any(strings, new Predicate<String>() {
    @Override public boolean apply(@Nullable String s) {
        return s.equalsIgnoreCase("fuuuu");
    }
});
System.out.printf("Do any match? %s%n", well ? "Yep" : "Nope");
5 голосов
/ 14 июля 2018

Начиная с Java 8, вы можете преобразовать коллекцию в поток и использовать anyMatch , как в следующем примере.

import java.util.Arrays;
import java.util.List;

public class SomeExample {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, -6, 7);
        boolean hasNegative = list.stream().anyMatch(x -> x < 0);
        if (hasNegative) {
            System.out.println("List contains some negative number");
        }
        else {
            System.out.println("List does not contain any negative number");
        }
    }
}
4 голосов
/ 24 января 2012

Вы можете использовать CollectionUtils от Apache commons-collection :

List<Integer> primes = Arrays.asList(3, 5, 7, 11, 13)
CollectionUtils.exists(primes, even);  //false

Где even - предикат:

Predicate even = new Predicate() {
    public boolean evaluate(Object object) {
        return ((Integer)object) % 2 == 0;
    }
}

Или в встроенной версии:

List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13)
CollectionUtils.exists(primes, new Predicate() {
    public boolean evaluate(Object object) {
        return ((Integer)object) % 2 == 0;
    }
});

Да, ужасен по двум причинам:

  1. Java (пока) не поддерживает функциикак первоклассные граждане, эмулируемые с помощью интерфейса Single-Abstract-Method.
  2. commons-collections не поддерживает генерики.

С другой стороны, в современной JVMтакие языки, как Scala, вы можете написать:

List(3,5,7,11,13,17).exists(_ % 2 == 0)
0 голосов
/ 24 января 2012

Java не имеет этой встроенной функции. Javascript some() принимает указатель функции в качестве аргумента, который изначально не поддерживается в Java. Но было бы довольно просто эмулировать функциональность some() в Java с использованием цикла и интерфейса для функций обратного вызова.

...