間に差はあるのforeachや地図か?
-
21-08-2019 - |
質問
Okなので、これはコンピュータ科学の疑問、質問に基づき、特定の言語のものの間に差はある地図操作、foreachに働きかけているのか?もしかしてだけで異なる名前で同様こんなことをしたのだろう。
解決
様々ます。
foreachのリストを反復処理と
(例えば、データベースへのそれぞれを保存するように)各リスト部材に副作用を伴ういくつかの動作を適用します リスト上マップの反復は、そのリストの各メンバーを変換し、そして(例えば大文字に文字列のリストを変換するように)形質転換体と同じ大きさの別のリストを返す
他のヒント
それらの間の重要な違いは、何も返さないmap
一方foreach
は、コレクションに結果のすべてを蓄積していることです。あなたは機能を持つ要素のコレクションを変換したいときmap
は、単に各要素に対してアクションを実行し、一方、foreach
は通常、使用されます。
は、 foreach
での応用操作の各要素の要素のコレクションは、 map
は変換するためのコレクションです。
あの差異について foreach
や map
.
foreach
のない概念の制限の操作で適用される以外にも受け入れの要素としての引数。の運営するものであり、副作用が戻り値の型関数が値を返す場合は戻り値の型関数が値を返す.すべてのforeach
うつに対して繰り返し処理を実行する要素のコレクションを適用した運転の各要素になります。map
, のない制限動作であると期待していますの操作を返し要素もあるかも受け入れの要素としての引数。のmap
操作を繰り返して調べて、要素のコレクションを使用して、操作の各要素を、最後に保存結果の各メソッドの呼び出しの動作を他収集します。つまり、map
変換 一コレクションです。foreach
動作シングルコレクションの要素の集まりです。ここに入力します。map
作品と集要入力のコレクション出力です。
間違えのなる二つのアルゴリズム実際、ビューの階層が map
は専門性の foreach
.すなわち、利用可能 foreach
の運用変更によって引数に挟み込んで使ってください。他収集します。その foreach
アルゴリズムを抽象化、一般化、 map
アルゴリズムです。実際、 foreach
無制限動作しいと言えるでしょ foreach
もっとも簡単なループ機構を発信するようになりましたが、できなループが開いていきます。 map
, その他の専門的なアルゴリズムで、ある表現力:をご希望の場合はマップ(または変換)-一コレクションの他、ご意向がより明確にご利用の場合 map
以上ご利用の場合 foreach
.
ここで更にディスカッションについて考察 copy
アルゴリズムループをクローンのコレクションに納めるものです。このアルゴリズムはあまりにも専門性の foreach
アルゴリズムです。定義ができるための操作された要素を挿入します同じ要素を他収集します。ご利用の場合 foreach
その運転効果の copy
アルゴリズムを伴いつつも低減、鮮明な表現力や分かりやすさ.みなさ:ると言えるでしょ map
は専門性の copy
, も専門性 foreach
. map
月 変化 任意の要素を繰り返して調べています。の場合 map
な変更の要素をその単 コピー の素子を使用 コピー 表現の意図があります。
の foreach
アルゴリズム自体が持っていない戻り値によっては、開されたものの翻訳であります。C++では、例えば、 foreach
を返す動作った。この操作がした状態、またその操作の後の検査方法で展しております。 map
, もは戻り値の型関数が値を返す.C++ transform
(これに準ずる者に対 map
こちら)が返す反復子は出力コンテナ(コレクション).Rubyで、戻り値の map
入力シーケンス(回収).なので、返却値の型に"byte[]"を指定アルゴリズムは、実装の詳細;その効果を示すものではありませんか。
Array.protototype.map
法 Array.protototype.forEach
の両方ができていることが分かります。
以下のコード: http://labs.codecademy.com/bw1/6#:workspace
var arr = [1, 2, 3, 4, 5];
arr.map(function(val, ind, arr){
console.log("arr[" + ind + "]: " + Math.pow(val,2));
});
console.log();
arr.forEach(function(val, ind, arr){
console.log("arr[" + ind + "]: " + Math.pow(val,2));
});
その中の正確な数理計算上の差異の処理結果です。
arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25
arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25
でもクオリティにがっかりしておられたときに実行は以下のコード:-
ここまでの結果の戻り値からの地図は、forEachます。
var arr = [1, 2, 3, 4, 5];
var ar1 = arr.map(function(val, ind, arr){
console.log("arr[" + ind + "]: " + Math.pow(val,2));
return val;
});
console.log();
console.log(ar1);
console.log();
var ar2 = arr.forEach(function(val, ind, arr){
console.log("arr[" + ind + "]: " + Math.pow(val,2));
return val;
});
console.log();
console.log(ar2);
console.log();
今の結果であっ!
arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25
[ 1, 2, 3, 4, 5 ]
arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25
undefined
結論
Array.prototype.map
配列を返しますが Array.prototype.forEach
は来ない。で操作でき、返される配列内のコールバック関数に渡された地図の方法及びそれを返します。
Array.prototype.forEach
みの散策を通じて、指定された配列のできないものの、歩きながらの配列になります。
最も「目に見える」の違いは、foreachのは、実行自体に対してのみ行われている間マップは、新しいコレクションに結果を蓄積することである。
が、余分な仮定のカップルがあります:マップの「目的」は新しい値のリストであるため、それが本当に実行順序を重要しません。実際には、いくつかの実行環境は、並列コードを生成し、あるいは全くいくつかの呼び出しを避けるために、繰り返される値、またはlazynessのために呼び出しを避けるためにいくつかのmemoizingをご紹介します。
foreachのは、一方で、副作用のために特別に呼ばれます。したがって、順序が重要であり、通常は並列化することはできません。
答え: map
や forEach
が異なります。また、非公式に言うと、 map
は厳しいの上位集 forEach
.
長い回答: 最初のうちは一線の説明 forEach
や map
:
forEach
を繰り返して調べてすべての要素を供給機能することが望ましい。map
を繰り返して調べてすべての要素を供給機能は、生産変換された配列を記憶させることによる結果の各機能ます。
多くの言語 forEach
といわれるだけで each
.以下の議論では、JavaScriptを使用してます。であるその他の言語です。
現在、プログラムを利用しましょうそれぞれの機能
を使用 forEach
:
課題1: 関数を書く printSquares
, を受け入れる配列数 arr
, は、印刷にスクエアの各要素です。
解決法1:
var printSquares = function (arr) {
arr.forEach(function (n) {
console.log(n * n);
});
};
を使用 map
:
課題2: 関数を書く selfDot
, を受け入れる配列数 arr
, し、配列を返します記載の各要素にスクエアに対応する要素 arr
.
別:ここで、俗語、というスクエアに入力配列の型になります。正式には入れなど、新しい計算でのドット製品そのものです。
解決法2:
var selfDot = function (arr) {
return arr.map(function (n) {
return n * n;
});
};
どのように map
は、上位集の forEach
?
利用できる map
解決の両方のタスク 課題1 や タスク2.しかし、利用できません forEach
を解決する タスク2.
に 解決法1, た場合、単に交換 forEach
による map
, のソリューションが有効になります。に 解決法2 ただし、置き換え map
による forEach
様お休み頂きますので予めた働きます。
の実施 forEach
面 map
:
他の実現を目指し map
's"の優位性を導入することによって、現在 forEach
面 map
.としているプログラマまなトの名前空間。まぐ forEach
, は、 each
.
Array.prototype.each = function (func) {
this.map(func);
};
今はいない場合はのよう prototype
プロジェクトが---wまぁ、もう好きにしちゃってください:
var each = function (arr, func) {
arr.map(func); // Or map(arr, func);
};
なので、やっぱり..なぜな forEach
ものがありますか?
その答えはます。ご興味のない変配列を他の配列、なぜすべき計算は、変換された配列?のみをダンプです。"最強"の称号は君の手に!だいたい変態さんな変容をもたらす。
なのでリスペクトしながら、地図を解決するために用いられ 課題1, でもよいと思います。ごとに候補者です。
独自の回答:
ながらいきい@madlep's応答ので、そういった点を指摘 map()
は 厳しいスーパーセット の forEach()
.
あり map()
通常用いられている新しい配列の型になります。ただし、こ も を変更する現在の配列になります。
次に例を示します。
var a = [0, 1, 2, 3, 4], b = null;
b = a.map(function (x) { a[x] = 'What!!'; return x*x; });
console.log(b); // logs [0, 1, 4, 9, 16]
console.log(a); // logs ["What!!", "What!!", "What!!", "What!!", "What!!"]
上記の例では、 a
したが便利になるように設定さ a[i] === i
のための i < a.length
.でも、この力 map()
.
この公式の説明 map()
.ご注意 map()
も変化の配列です!雹 map()
.
これを実施したと日経が報じている。
編10月-2015年追加案す.
ここでリストを使用してスカラ座での例は次のとおりです。マップはリストを返し、foreachのは何も返しません。
def map(f: Int ⇒ Int): List[Int]
def foreach(f: Int ⇒ Unit): Unit
は、マップは、各リスト要素に関数fを適用した結果のリストを返すので
scala> val list = List(1, 2, 3)
list: List[Int] = List(1, 2, 3)
scala> list map (x => x * 2)
res0: List[Int] = List(2, 4, 6)
foreachのは、単に各要素にfを適用されます。
scala> var sum = 0
sum: Int = 0
scala> list foreach (sum += _)
scala> sum
res2: Int = 6 // res1 is empty
あなたが特にJavascriptの話をしている場合には、差がmap
がイテレータである間forEach
は、ループ機能があるということです。
map
を使用します。
forEach
を使用するために、の行うのリストの各要素に基づいて何か。あなたは、たとえば、ページに物事を追加することがあります。基本的に、それはあなたが「副作用」したいときのために素晴らしいことだ。
その他の違い:(それは本当に制御フロー機能であるため)forEach
は何も返さない、とマップが新しいリストを返し、唯一の現在の要素に渡すのに対し、渡された関数は、インデックスとリスト全体への参照を取得します。
のForEachは、このようなバックは何も返さずにRDDの各要素に対してデシベルなどへの書き込みなどの機能を適用しようとします。
しかしmap()
はRDDの要素の上にいくつかの関数を適用し、RDDを返します。だから、あなたは以下のメソッドを実行したときには、LINE3で失敗することはありませんが、foreachの適用後、RDDを収集しながら、それが失敗すると
<モジュール> でファイル "
"、5行目、 はAttributeError: 'NoneType' オブジェクトが属性を持っていません。
'集めます'
nums = sc.parallelize([1,2,3,4,5,6,7,8,9,10])
num2 = nums.map(lambda x: x+2)
print ("num2",num2.collect())
num3 = nums.foreach(lambda x : x*x)
print ("num3",num3.collect())