Є два варіанти питання OP:
- Що таке "процес отримання токенів з TokenStream"?
- "Хтось може пояснити, як отримати токен-подібну інформацію з TokenStream?"
Останні версії документації до Lucene дляToken say (курсив додано):
ПРИМІТКА: Починаючи з 2.9 ... більше не потрібно використовувати Token, з новим API TokenStream його можна використовувати як зручний клас, що реалізує всі атрибути, що особливо корисно для легкого переходу зі старого на новий API TokenStream.
І TokenStreamкаже свій API:
... перейшов із заснування маркера на засіб атрибутів ... найкращим способом зберігання інформації про маркер є використання AttributeImpls.
Інші відповіді на це запитання охоплюють №2 вище: як отримати токеноподібну інформацію з a TokenStream"новим" рекомендованим способом, використовуючи атрибути. Читаючи документацію, розробники Lucene припускають, що ця зміна була внесена, зокрема, для зменшення кількості окремих об’єктів, створених одночасно.
Але, як деякі люди зазначали в коментарях до цих відповідей, вони не відповідають прямо No1: як отримати, Tokenякщо ви справді хочете / потребуєте такого типу?
З таким же зміною API , що робить , тепер знаряддя і може бути використаний з TokenStream.addAttribute так само , як інші відповіді показують на і . Тож вони справді відповіли на цю частину вихідного запитання, просто не показали.TokenStreamAttributeSourceTokenAttributeCharTermAttributeOffsetAttribute
Важливо, що, хоча цей підхід дозволить вам отримати доступ Tokenпід час циклу, це все одно лише один об’єкт, незалежно від того, скільки логічних маркерів знаходиться в потоці. Кожен заклик до incrementToken()змінитиме стан Tokenповернення з addAttribute; Отже, якщо ваша мета - створити колекцію різних Tokenоб’єктів, які будуть використовуватися за межами циклу, вам доведеться виконати додаткову роботу, щоб створити новий Token об’єкт як (глибоку?) Копію.
CharTermAttributeImpl.toString()цього