Я часто хочу сопоставить один список в другом списке. Например, если у меня был список людей, и мне нужен список их имен, я бы хотел:
ЦЕЛЬ
List<Person> people = ... ;
List<String> names = people.map(x -> x.getName());
Что-то вроде этого возможно с Java 8:
JAVA 8 VERSION
List<String> names = people.stream()
.map(x -> x.getName())
.collect(Collectors.toList());
Но это явно не так хорошо. На самом деле, я думаю, что использование Guava является более чистым:
ВЕРСИЯ GUAVA
List<String> names = Lists.transform(people, x -> x.getName());
Однако мне нравится цепочки. Итак, возможна ли моя цель?
Я слышал, что люди говорят, что методы Java 8 по умолчанию похожи на методы расширения С#. С помощью метода расширения С# я мог бы легко добавить вспомогательный метод к IEnumerable<T>
:
public static IEnumerable<TRet> Map<T, TRet>(this IEnumerable<T> list, Func<T, TRet> selector)
{
return list.Select(selector);
}
Однако я не могу понять, как использовать методы по умолчанию для расширения существующего интерфейса.
Кроме того, это, очевидно, тривиальный пример. В общем, я хотел бы расширить возможности интерфейсов List<T>
и Iterable<T>
, чтобы упростить взаимодействие с потоками api.