Ответ 1
Я выхожу на конечность с этим ответом, но, возможно, стоит упомянуть об этом:
Нет никакого способа сделать это. Как указал Брайан Гетц в ответе на соответствующий вопрос, в этом смысле нет конкретных надежных способов получения "содержимого" лямбда.
Но (и теперь идет расплывчатая, ручная часть):
Нет способа сделать это еще.
Возможно, это будет возможно в будущем. Возможно, не с Java 9, а позже. Project Panama имеет амбициозные цели, в том числе предоставление разработчикам более глубокого доступа к лямбдам, помощь в дальнейших (время выполнения) оптимизации, переводах и обработке.
И недавно Radosław Smogura опубликован в списке рассылки:
Я пытаюсь захватить лямбда-выражение, чтобы получить их как дерево выражений во время выполнения. Im способен сделать это для простых lambdas like (o) → (var == var) && & & ((varX == varX) && (someField + 1 == 1)), поэтому позже пользователь может использовать (отсутствует) API для изучения дерева.
Прямо сейчас к дереву можно получить доступ с таким кодом:
Method m = BasicMatadataTest.class.getDeclaredMethod("lambda$meta0"); Expression e = (Expression) m.invoke(null); BinaryExpression top = (BinaryExpression) e; BinaryExpression vars = (BinaryExpression) top.getLefthandExpression(); // represents (var == var) (VariableExpression) vars.getLefthandExpression() // represents first var, and it’s reference equal to vars.getRighthandExpression() as it’s same variable
...
Ключевым моментом здесь может быть комментарий:
представляет первый var, а его ссылочный - vars.getRighthandExpression() как его же переменную
(e.b.m)
Итак, если я правильно понял ваш вопрос и это сообщение для рассылки, тогда можно было бы определить эквивалентность между такими выражениями: сравнение древовидной структуры было бы довольно тривиальным (учитывая приведенную выше функциональность). И тогда это может свести к рассмотрению двух VariableExpression
как "равных", независимо от фактического имени переменной.
Сообщение списка рассылки указывает на репозитории:
(Отказ от ответственности: я не тестировал это и не знаю, как это сделать (или это вообще работает), но, на мой взгляд, это, по крайней мере, очень близко к тому, что было на самом деле),