RubioRic:
私は構造を持っていることをみましょうと言うタイトルで説明します:
Map<String, Map<String, Car>> mapNeighborhood
それは、それぞれのアドレスとプレートによってインデックス付け周辺にすべての車が含まれています。私は黒でそれらを再描画するために、すべての赤の車を選択します。そのタスクを達成するために、私は「フラット」に、両方の地図を試してみましたが、私は述語私は赤い車を選択し、再描画を適用することができます適用し、リストを持ったら、Javaの8を使用してリストを取得しています。
List<Car> listCars = new ArrayList<Car>();
mapNeighborhood.values().forEach(map -> map.values()
.forEach(car -> listCars.add(car)));
listCars.stream().filter(Car::isRed)
.forEach(car -> car.repaint(Color.Black));
私は、Java 8でちょうど1行を使用して同じことを達成できることを確信している、私はあなたが読みやすさを失う可能性があることだと思います。
私の質問は:リストの中に地図を平坦化する別の少ない冗長方法はありますか?たぶん使用flatMap
。前もって感謝します。
ボリス・スパイダー:
あなたは、中間体を必要としません List
mapNeighborhood.values().stream()
.flatMap(byPlate -> byPlate.values().stream())
.filter(Car::isRed)
.forEach(car -> car.repaint(Color.Black))
私は、これは両方だと思うよりあなたのコードと短いよりも読みやすいです。また、客観的である多くの両方の時間と空間で、より効率的。
また、ノートCar::isRed
やや奇妙あなたが可能なすべてのチェック必要があるだろうとしてあるColor
上Car
-新しいを追加しcolor
、シーズンに向けて再実装をCar
。
Color::isRed
で、はるかに理にかなっているCar
道具Colored
またはそのようないくつかの
interface Colored {
Color getColor();
}
// in Color
public static boolean isRed(Colored colored) {
return Objects.equals(colored.getColor(), RED);
}