我需要一个 地图 功能。爪哇已经有这样的东西了吗?

(对于那些想知道的人:我当然知道如何自己实施这个琐碎的功能...)

有帮助吗?

解决方案

从JAVA 6开始,JDK中没有功能的概念。

瓜瓦 有一个 功能 界面和
Collections2.transform(Collection<E>, Function<E,E2>)
方法提供您需要的功能。

例子:

// example, converts a collection of integers to their
// hexadecimal string representations
final Collection<Integer> input = Arrays.asList(10, 20, 30, 40, 50);
final Collection<String> output =
    Collections2.transform(input, new Function<Integer, String>(){

        @Override
        public String apply(final Integer input){
            return Integer.toHexString(input.intValue());
        }
    });
System.out.println(output);

输出:

[a, 14, 1e, 28, 32]

如今,使用Java 8,实际上有一个地图功能,所以我可能以更简洁的方式编写代码:

Collection<String> hex = input.stream()
                              .map(Integer::toHexString)
                              .collect(Collectors::toList);

其他提示

自Java 8以来,有一些标准选项可以在JDK中执行此操作:

Collection<E> in = ...
Object[] mapped = in.stream().map(e -> doMap(e)).toArray();
// or
List<E> mapped = in.stream().map(e -> doMap(e)).collect(Collectors.toList());

java.util.Collection.stream()java.util.stream.Collectors.toList().

有一个很棒的图书馆叫 功能性Java 哪个处理您要Java拥有的许多东西,但事实并非如此。再说一次,还有这种出色的语言Scala可以完成Java应该做的一切,但在仍然与JVM编写的任何内容兼容时都没有。

非常小心 Collections2.transform() 来自番石榴。该方法的最大优势也是它的最大危险:懒惰。

看文档 Lists.transform(), ,我相信这也适用于 Collections2.transform():

该功能懒洋洋地应用,在需要时调用。这对于返回的列表为视图是必不可少的,但是这意味着该函数将用于诸如list.contains(java.lang.object)和list.hashcode()之类的批量操作多次。为了表现良好,功能应该很快。为了避免在返回列表不需要视图时懒惰评估,请将返回的列表复制到您选择的新列表中。

也在文档中 Collections2.transform() 他们提到您获得了现场视图,源列表中的更改会影响转换后的列表。如果开发人员没有意识到其工作方式,这种行为可能会导致难以进行问题。

如果您想要一个更古典的“地图”,那将仅一次运行一次,那么您最好选择 FluentIterable, ,也来自Guava,其操作更简单。这是Google示例:

FluentIterable
       .from(database.getClientList())
       .filter(activeInLastMonth())
       .transform(Functions.toStringFunction())
       .limit(10)
       .toList();

transform() 这是地图方法。它使用相同的函数<>“回调”与 Collections.transform(). 。您回来的列表是只读的,请使用 copyInto() 获取读写列表。

否则,当然,当Java8与Lambdas一起出现时,这将是过时的。

这是您可以使用地图的另一个功能性LIB: http://code.google.com/p/totallylazy/

sequence(1, 2).map(toString); // lazily returns "1", "2"

即使这是一个古老的问题,我想展示另一个解决方案:

只需使用Java Generics和Java 8流来定义您自己的操作:

public static <S, T> List<T> mapAll(Collection<S> collection, Function<S, T> mapper) {
   return collection.stream().map(mapper).collect(Collectors.toList());
}

比您可以这样写代码:

List<String> hex = mapAll(Arrays.asList(10, 20, 30, 40, 50), Integer::toHexString);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top