On 3/20/2015 7:54 PM, Richard Eckart de Castilho wrote: > Did you get inspired by the uimaFIT JCasUtils? ;) Of course :-) ( and I've seen other examples, too) But I'm trying to do the generics with as few uses of things like uimaFITs "cast" trick as I can figure out how...
> > Do you have any experience yet with the Java 8 Stream API? Unfortunately not... I've read about it, only... > It might be worth to take it into account already and trying > to design such an API-change in UIMA in such a way that it > plays nicely with the stream API. E.g. filtering for annotations > with certain properties or mapping annotations into a collection > of feature values, covered texts, etc. Good ideas... but maybe a bit further in the future (at least for me...) -Marshall > > Cheers, > > -- Richard > > On 20.03.2015, at 22:11, Marshall Schor <[email protected]> wrote: > >> In UIMA, we support a Java-friendly style for accessing Feature Structures, >> typically via the JCas which supplies a Java Class for each UIMA type. >> >> A typical use pattern for indexes is to get a named index from the index >> repository for a CAS view, and then use that index to get an iterator over >> instances of that (or use the index as an "Iterable" in a for loop). >> >> For iterators returning JCas instances, it would be nice to have those take >> advantage of generics. So, for example, it would be nice to be able to write >> without casts, etc.: >> >> AnnotationIndex<SourceDocumentInformation> >> anIndexOverSourceDocumentInformationType = >> cas.getAnnotationIndex(the_UIMA_type_for_SourceDocumentInformation); >> >> or >> >> AnnotationIndex<SourceDocumentInformation> >> anIndexOverSourceDocumentInformationType = >> cas.getAnnotationIndex(SourceDocumentInformation.class); // << NEW! >> >> and then >> >> Iterator<SourceDocumentInformation> iter = >> anIndexOverSourceDocumentInformationType.iterator(); >> >> or using Iterable: >> >> for (SourceDocumentInformation sdi : >> anIndexOverSourceDocumentInformationType) { >> ... // use as an iterable >> } >> >> It would be nice to be able to combine these two things (getting the index, >> then >> getting the iterator over the index) by chaining these, like this: >> >> Iterator<SourceDocumentInformation> iter = >> cas.getAnnotationIndex(SourceDocumentInformation.class).iterator(); >> >> I've found a way to update the way generics are used to have the Index and >> FSIterator APIs work like this. One thing I couldn't discover how to do was >> to >> have this form work: >> >> Iterator<SourceDocumentInformation> iter = >> cas.getAnnotationIndex(the_UIMA_type_for_SourceDocumentInformation).iterator(); >> >> This variant (which inserts a Java Class) works, though (I didn't realize >> Java >> even supported this syntax until recently: >> >> Iterator<SourceDocumentInformation> iter = cas. <SourceDocumentInformation> >> getAnnotationIndex(the_UIMA_type_for_SourceDocumentInformation).iterator(); >> >> I plan to add the support for making generics useful in this way, plus the >> alternative which allows passing the class instance of a UIMA type (e.g., >> SourceDocumentInformation.class), and welcome suggestions for improvements >> :-) >> ; I hope the support for "iterables" (like the "for" loop example above) >> will >> be especially useful. >> >> -Marshall > >
