質問

私は〜が必要です 地図 働き。すでにJavaにこのようなものはありますか?

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

役に立ちましたか?

解決

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に持ってもらいたいことの多くを処理しますが、そうではありません。繰り返しになりますが、この素晴らしい言語のスカラもあります。これは、Javaがすべきことすべてを行う必要がありますが、JVMのために書かれたものと互換性がありながらそうではありません。

非常に注意してください Collections2.transform() グアバから。その方法の最大の利点は、その最大の危険でもあります。その怠lazです。

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

関数は怠lazに適用され、必要に応じて呼び出されます。これは、返されたリストがビューになるために必要ですが、list.contains(java.lang.object)やlist.hashcode()などのバルク操作に関数が何度も適用されることを意味します。これがうまく機能するためには、機能は高速でなければなりません。返されたリストがビューである必要がないときに怠zyな評価を避けるには、返されたリストを選択の新しいリストにコピーします。

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

より古典的な「マップ」が必要な場合は、一度だけ実行されると、あなたは FluentIterable, 、また、より簡単な操作があるグアバから。これがGoogleの例です。

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

transform() これがマップ方法です。同じ関数<>「コールバック」を使用します Collections.transform(). 。あなたが戻ってきたリストは読み取り専用ですが、使用してください copyInto() 読み取りワイトリストを取得します。

それ以外の場合、もちろんJava8がラムダで出てくると、これは時代遅れになります。

これは、マップを使用できるもう1つの機能的な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