158

地図機能が欲しい。Javaにはすでにこのようなものがありますか?

(不思議に思う人のために:もちろん、私はこの些細な機能を自分で実装する方法を知っています...)

4

6 に答える 6

106

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()

于 2014-01-08T15:05:01.093 に答える
90

Java 6 の時点で、JDK には関数の概念はありません。

ただし、 GuavaにはFunctionインターフェースがあり、 メソッドは必要な機能を提供します。
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 では実際に map 関数が存在するため、コードをより簡潔な方法で記述したいと思います。

Collection<String> hex = input.stream()
                              .map(Integer::toHexString)
                              .collect(Collectors::toList);
于 2010-10-11T15:05:16.643 に答える
26

Functional Javaと呼ばれるすばらしいライブラリーがあります。これは、Java に持たせたい機能の多くを処理しますが、そうではありません。繰り返しになりますが、この素晴らしい言語 Scala もあります。これは、Java が行うべきことはすべて行いますが、JVM 用に作成されたものとは互換性がありますが、そうではありません。

于 2010-10-11T15:04:57.177 に答える
9

Collections2.transform()グアバからの取り扱いには十分注意してください。この方法の最大の利点は、最大の危険でもあります。つまり、怠惰です。

のドキュメントを見てくださいLists.transform()。これは にも当てはまると思いますCollections2.transform():

関数は遅延して適用され、必要に応じて呼び出されます。これは、返されるリストをビューにするために必要ですが、List.contains(java.lang.Object) や List.hashCode() などの一括操作で関数が何度も適用されることを意味します。これがうまく機能するには、関数が高速である必要があります。返されたリストがビューである必要がない場合に遅延評価を回避するには、返されたリストを選択した新しいリストにコピーします。

また、彼らのドキュメントではCollections2.transform()、ライブビューを取得すると述べています。ソースリストの変更は、変換されたリストに影響します。この種の動作は、開発者がその動作方法を理解していない場合、追跡が困難な問題につながる可能性があります。

より古典的な「マップ」が必要な場合は、1 回だけ実行されます。FluentIterable操作がはるかに単純な Guava の を使用することをお勧めします。これがそのグーグルの例です:

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

transform()これが map メソッドです。と同じ Function<> 「コールバック」を使用しCollections.transform()ます。返されるリストは読み取り専用ですがcopyInto()、読み取り/書き込みリストを取得するために使用します。

それ以外の場合はもちろん、java8 がラムダを使用するようになると、これは廃止されます。

于 2013-05-31T10:18:50.220 に答える
2

これは、マップを使用できる別の機能ライブラリです: http://code.google.com/p/totallylazy/

sequence(1, 2).map(toString); // lazily returns "1", "2"
于 2012-12-04T11:32:34.633 に答える
2

古い質問ですが、別の解決策を示したいと思います:

JavaジェネリックとJava 8ストリームを使用して独自の操作を定義するだけです:

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

次のようなコードを書くことができます。

List<String> hex = map(Arrays.asList(10, 20, 30, 40, 50), Integer::toHexString);
于 2018-10-17T19:06:34.723 に答える