3

PHPでは、次のことができますforeach($array as $key=>$value){//codes。Javaで関数を作成して実行することは可能foreach(arr,function(key,value){//codes});ですか?

私はJavaがあまり得意ではありません。関数が機能するには、すべてのデータ型を受け入れる必要があります。また、コールバック関数が Java で使用できるかどうかもわかりません。

PS「不可能」は有効な答えです、ありがとう!

4

8 に答える 8

9

他の回答では、「拡張 for ループ」構文がどのように機能するかが説明されています。そして、それはあなたが必要としているものかもしれません。

しかし、あなたが実際に尋ねた質問に答えたいと思います:

Javaで関数を作成して行うことは可能ですか:

 foreach(arr,function(key,value){//codes});

書かれているように、これは別の関数をパラメーターとして受け取る関数 (またはメソッド) になります。これは、現在定義されている Java では不可能です。Java では、関数 (またはメソッド) をファースト クラス オブジェクトとして扱うことはできません。引数として渡すことはできません。(現在の) Java で得られる最も近い方法は、次のFunctionようなインターフェイスを作成することです。

public interface Function {
   public void fun(Object arg1, Object arg2);
}

次のように使用します。

Object[] arr = ...
foreach (arr, new Function() {
    public void fun (Object key, Object value) {
        // do stuff
    }});

(私は、PHP 配列が Java 配列というよりも Java HashMap に似ているという事実を無視しています。これは、この種のものを実装する方法に影響します...しかし、それは私がしようとしている要点から逸れています. )

将来のある時点で、Java は拡張されて、ファーストクラスの関数 / クロージャー / ラムダなどをサポートする予定です。しばらくの間、この機能は Java 7 向けに予定されていましたが、Java 7 を完成させるために延期する必要がありました。

更新- ラムダのサポートがJava 8になることが明らかになりました。この新機能は、初期リリースのダウンロードに含まれていました。

于 2012-04-05T14:16:47.640 に答える
9

はい、できます:

List<String> ls = new ArrayList();
ls.add("Hello");
ls.add("world");
//your foreach sentence
for(String s : ls) {
    System.out.println(s);
}

これは別のクラスでも機能します。

アップデート

リスト (配列またはリンクされたリスト) をトラバースすると、インデックスがインデックスになります。インデックスを保持するには、別の整数を使用する必要があります。

List<String> ls = new ArrayList();
ls.add("Hello");
ls.add("world");
//your foreach sentence
int index = 0;
for(String s : ls) {
    System.out.println("index: " + index);
    System.out.println(s);
    //put your logic here...
    //at the end, update the index manually
    index++;
}

Map (キー、値ベースの構造) をトラバースする必要がある場合は、@LukasEder によって記述されたメソッドを使用する必要があります (彼のコードを適応させます)。

Map<K, V> array = new HashMap<K, V>();
for (Entry<K, V> entry : array.entrySet()) {
    // You have to explicitly call your callback. There is no "callback-syntax"
    // to the Java "foreach" loop
    System.out.println("key: " + entry.getKey());
    System.out.println("value: " + entry.getValue());
    //put your logic here...
}
于 2012-04-05T13:52:11.063 に答える
4

PHP 配列は実際には連想配列であるため、コードに最も近いのは Java を使用することですMap

Map<K, V> array = new HashMap<K, V>();
for (Entry<K, V> entry : array.entrySet()) {
  // You have to explicitly call your callback. There is no "callback-syntax"
  // to the Java "foreach" loop
  MyClass.myMethod(entry.getKey(), entry.getValue());
}

<K><V>をより具体的なタイプに置き換えます。たとえばMap<String, String>、 、またはMap<Integer, String>など...

真の (インデックス付き) 配列を使用している場合、インデックスにアクセスするために "foreach" ループを記述することはできません。インデックス付きループに頼る必要があります。

// Using Java arrays
String[] array = { "a", "b", "c" };
for (int i = 0; i < array.length; i++) {
  MyClass.myMethod(i, array[i]);
}

// Using Java Lists
List<String> list = Arrays.asList("a", "b", "c");
for (int i = 0; i < list.size(); i++) {
  MyClass.myMethod(i, list.get(i));
}
于 2012-04-05T13:53:01.747 に答える
3

たとえば、Java には foreach があります。

List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");

for (String s : list) {
    System.out.println(s);
}
于 2012-04-05T13:52:02.223 に答える
1

はい。Iterableを実装する配列またはオブジェクトを反復処理する場合は、次の構文が機能します。

SomeType someValue=null;
for (someValue : setOfValues) {
   ...
}

例えば:

Map<String,String> colors=new HashMap<String,String>();
colors.put("r","red");
colors.put("g","green");
colors.put("b","blue");
for (String code : colors.keySet()) {
  process(code, colors.get(code));
}
于 2012-04-05T14:06:30.873 に答える
1

はい、Javaにはそれがあります。配列とIterables の反復を許可します。

List<String> list = new ArrayList<>();
...
for(String s : list) { // since List<T> implements Iterable<T>.
}
于 2012-04-05T13:53:35.233 に答える
0

はい、反復しているコレクションがimplementsである限り、できますIterable。SOあなたは次のようなものを持つことができます:

Map<String, Object> map = new HashMap<String, Object>();
...
for (String str : map.keySet())
{
     System.out.println(str);
}

HashMapこれにより、キーと値のコレクションである が作成されます。Listsやなどの通常のコレクションを反復したいだけの場合はArrays、次のようにすることができます。

List<String> strings = new ArrayList<String>();
....
for(String str : strings)
{
     System.out.println(str);
}
于 2012-04-05T13:53:52.673 に答える
0

これは「拡張 for ループ」と呼ばれます。

スクリーンキャスト: http://www.youtube.com/watch?v=w41D0V-BnKQ

http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html

http://www.java-tips.org/java-se-tips/java.lang/the-enhanced-for-loop.html

于 2012-04-05T13:54:14.153 に答える