función genérica `any` para Java

Tengo varios Node, Tokeny otras clases. Cada clase tiene su propia Typeenumeración.

Tengo listas de nodos, y listas de tokens, y listas de otras cosas.

Y a menudo quiero ver si hay elementos de un particular Typeen una lista.

Por ejemplo, para ver si hay palabras clave en una lista de tokens, me gustaría recorrerlas:

Token found = null;
for(Token token: statement)
    if(token.type == Token.Type.KEYWORD &&
      (token.token.equals("static") ||
      (token.token.equals("final")) {
        found = token;
        break;
    }
if(found != null) {
    ....

Si escribo pequeños ayudantes, puedo ordenar mucho mi código (ya que quiero averiguar mucho qué hay en las listas):

Token any(Collection<Token> haystack,Token.Type type,String... needles) {
   for(Token straw: haystack)
       if(straw.type == type)
            for(String needle: needles)
                if(needle.equals(straw.token))
                    return straw;
   return null;
}

Entonces, en otro lugar, puedo:

if((found = any(statement,Token.Type.KEYWORD,"static","final")) != null)
   ...

¿Hay alguna forma de generalizar esto para Nodey otras variables, y para las comparaciones que no son cadenas y donde los campos son diferentes y se nombran de manera diferente?

Con las plantillas de C ++ puedes esquivar el tipo; con Java, estoy luchando por ver cómo hacer esto, aunque hacer que las clases sean comparables a sus propios tipos, ¿podría ser un camino a seguir?

Respuesta 1

Las cosas para las que usaría duck typing generalmente se pueden lograr con interfaces en java. Considere esta interfaz:

public interface Typed<T extends Enum<T>> {
    T getType();
    String getToken();
}

Luego puede cambiar su anymétodo para usar solo los tipos que implementan esta interfaz:

public <A extends Enum<A>, B extends Typed<A>> B any(Collection<B> haystack, A type, String... needles) {
    for (B straw : haystack)
        if (straw.getType().equals(type))
            for (String needle : needles)
                if (needle.equals(straw.getToken()))
                    return straw;
    return null;
}
Respuesta: 2

Como en el tema, me gustaría usar un método Java que tome una función como argumento y proporcionarle una función Clojure, ya sea anónima o normal. Alguien tiene alguna idea de cómo hacer eso?

Tengo una matriz String [] en Java, y primero debo codificarla / convertirla en una String y luego en el código convertirla nuevamente en la matriz String []. El caso es que puedo tener cualquier personaje en un ...

Hay algunas preguntas similares en el sitio que han sido de ayuda, pero no puedo precisar este problema, así que espero que esto no sea repetitivo. Esta es una tarea donde tienes una ...

Necesito ayuda para obtener información del RDF con Jena Framework. Tengo un contenido RDF como este: <rdf: RDF xmlns: rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns: ts = "http: //. ..