エラーを手元で解決するには、タイプ変換の問題です。コメントに既に記載されているkhelwoodのように、JavaコレクションにJavaコレクションを割り当てようとしていますが、それらは1つではありません。
あなたがPlayer
の配列を操作する必要がない場合は、配列
しかし
Player[] arrayOfPlayer = Bukkit.getOnlinePlayers().toArray(new Player[0]);
ではなく、時間の配列を作成する無駄を作成するには、次を使用することができ、あなたは、単にで直接コレクションの反復子することができます次の2つの方法の1:1)暗黙のうちに、
for (Player p : Bukkit.getOnlinePlayers()) {
if (modMode.contains(p.getName())) {
...
}
}
または、2)明示的に、
Iterator<? extends Player> it = Bukkit.getOnlinePlayers().iterator();
while (it.hasNext()) {
Player p = it.next();
if (modMode.contains(p.getName())) {
...
}
}
後者の方法は、メソッドが基になるコレクションを変更した場合に便利です。 getOnlinePlayers()
から要素を削除することはできません。変更可能なリストではありません。
更新
私はもともとOPの限られた経験を与えられたラムダ例を提供するために躊躇。ラムダは、実行されるアクションをさらに検討することなく、イテレータタスクのすべてのタイプのドロップイン置換であるとは限らず、別の明確な疑問が生じる可能性があります。
上述したように、可能なストリームの形式は次のようになります。
Bukkit.getOnlinePlayers().stream()
.filter(modMode::contains)
.forEach(p -> {
p.setMetadata("ModMode", new FixedMetadataValue(Main.pl, 1));
leaveMod(p);
});
これはさらに、両方が常にプレーヤーをマッチングさせるために実行されることを考えると、leaveMod()
内プレイヤのメタデータを設定することにより、機能的表現に向かって微調整することができます。 onDisableMod()
とleaveMod()
クラスModUtils
の静的メソッドであると仮定すると、上記ストリームは、与えられた全ての反復の例についてgetOnlinePlayers()
で繰り返し処理
Bukkit.getOnlinePlayers().stream()
.filter(modMode::contains)
.forEach(ModUtils::leaveMod);
特別な懸念を次のように、慎重にあるべきでさらに精製し、統合することができ彼らはメインスレッドまたは同期スレッドで実行されることを行使しました。さらに、反復中に、テレポート、キック、キル、または同じ事を行うcallEvent()
経由のイベントの発動など、コレクションに影響を与える副作用がないように注意する必要があります。このような場合には
、ベストプラクティスは、
List<Player> olp = new ArrayList<>(Bukkit.getOnlinePlayers());
のようにコレクションのコピーで動作し、繰り返しの3種類のいずれかを続行することです。
'getOnlinePlayers()'がコレクションを返す場合、配列に割り当てることはできません。配列はコレクションと同じではありません。 – khelwood
ようこそスタックオーバーフロー! [ツアー](http://stackoverflow.com/tour)を見て回り、[ヘルプセンター](http://stackoverflow.com/help)、特に[どのように私に質問しますか良い質問?](http://stackoverflow.com/help/how-to-ask)と[ここで私はどのような話題を聞くことができますか?](http://stackoverflow.com/help/on-topic)。 - * 'int j =(arrayOfPlayer = Bukkit.getOnlinePlayers())。length;' *このような「スマートコード」は避けてください。 –