У меня есть 2 List<xxx>
, и мне нужно пересечь их по xxx.getId()
, поэтому я использую Stream
и Lambda
. Вот эти шаги:
List<xxx> list1 = function1();
List<xxx> list2 = function2();
List<String> list1InString = list1.stream().map(input -> input.getId()).collect(toList());
list2 = list2.stream().filter(input -> list1InString.contains(input.getId())).collect(toList());
Я хочу сделать это, используя double colon
, например:
list2 = list2.stream().filter(list1InString::contains).collect(toList());
Но это неверно, потому что contains
ссылка на объект xxx не является методом String getId(). Я знаю, что трачу время на преобразование list1 в list1InString, но я не знаю лучшего метода. Любая помощь очень ценна, большое спасибо.
Редактировать: спасибо за многие ответы, я просто хочу сделать код более простым, используя двойное двоеточие (что для меня ново), но в этом случае его нельзя использовать. Особая благодарность Наману и Хольгеру за разъяснение моей проблемы.
list2
являетсяString
илиmap
передfiiler
, что, похоже, не так. - person Naman   schedule 11.12.2019equals
, но я бы не рекомендовал его лично из-за потери другой информации при сравнении объектов в целом. Другим было бы абстрагирование кода для фильтрации в служебный метод и использование его со ссылкой. Но этого не требуется, учитывая, что лямбда уже читается чисто и работает здесь надлежащим образом. - person Naman   schedule 11.12.2019Function
, но то же самое относится и к объединениюPredicate
иFunction
; вы можете комбинировать две ссылки на методы через вспомогательную функцию, но, в конце концов, нет никакого преимущества перед простым написанием лямбда-выражения. - person Holger   schedule 11.12.2019