在Java 8中扩展List <T>

Ald*_*den 11 java lambda guava java-8 default-method

我经常想将一个列表映射到另一个列表.例如,如果我有一个人员列表,我想要一个他们的名字列表,我想这样做:

目标

List<Person> people = ... ;

List<String> names = people.map(x -> x.getName());
Run Code Online (Sandbox Code Playgroud)

使用Java 8可以实现这样的功能:

JAVA 8版

List<String> names = people.stream()
                           .map(x -> x.getName())
                           .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但这显然不是那么好.事实上,我认为使用番石榴更清洁:

GUAVA版本

List<String> names = Lists.transform(people, x -> x.getName());
Run Code Online (Sandbox Code Playgroud)

但是,我喜欢链接.那么,我的目标是否可行?

我听说有人说Java 8默认方法类似于C#扩展方法.使用C#扩展方法,我可以轻松地将辅助方法添加到IEnumerable<T>:

public static IEnumerable<TRet> Map<T, TRet>(this IEnumerable<T> list, Func<T, TRet> selector)
{
    return list.Select(selector);
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何使用默认方法来扩展现有接口.

此外,这显然是一个微不足道的例子.通常,我希望能够扩展List<T>Iterable<T>接口,以便更容易地与流api进行交互.

SLa*_*aks 11

没有; 你不能这样做.

默认方法与扩展方法不同; 它们只能在原始界面中定义.