Java的通用`any`函数(generic `any` function for Java)
我有各种
Node
,Token
和其他类。 每个类都有自己的Type
枚举。我有节点列表,令牌列表和其他事项列表。
我经常想看看列表中是否有特定
Type
项目。例如,要查看令牌列表中是否有任何关键字 ,我会循环遍历它们:
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) { ....
如果我写小帮手,我可以整理我的代码很多(因为我想弄清楚列表中的内容):
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; }
然后,在其他地方,我可以:
if((found = any(statement,Token.Type.KEYWORD,"static","final")) != null) ...
是否有任何方法可以将此概括为
Node
和其他变量,以及不是字符串的比较和字段不同,并且命名方式不同?使用C ++模板,您可以使用鸭子类型; 使用Java,我很难看到如何做到这一点,虽然使类可以与他们自己的类型相媲美等等可能是前进的方向?
I have various
Node
,Token
and other classes. Each class has its ownType
enum.I have lists of nodes, and lists of tokens, and lists of other things.
And I often want to see if there are any items of a particular
Type
in a list.For example, to see if there are any keywords in a list of tokens, I'd loop over them:
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) { ....
If I write little helpers, I can tidy up my code a lot (as I want to work out what's in lists a lot):
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; }
Then, elsewhere, I can:
if((found = any(statement,Token.Type.KEYWORD,"static","final")) != null) ...
Is there any way to generalise this for
Node
and other variables, and for comparisons that are not strings and where the fields are different, and named differently?With C++ templates you can duck type; with Java, I'm struggling to see how to do this although making classes comparable to their own types and so on might be a way forward?
原文:https://stackoverflow.com/questions/13689880