All Articles

Javaの構文が想像以上にモダンであった。Streamのつまみ食い

Javaも宣言として書くスタイル、リアクティブプログラミングとして書くことができる。 これは、Java8からサポートされているので、現在Jav14なので随分昔から対応していることになる。 昔から存在する言語であっても、どんどん進化していくので、勉強はしなければならない。 Javaから遠ざかっていて、戻ってきたらすごい進化していたので驚いている。

とあるリストの合計を行う場合

Reducerを使って値を合算する方法でも以下のように3つも記述方法がある。

  private static int calculateTotalCalories() {
    return menu.stream().collect(reducing(0, Dish::getCalories, (Integer i, Integer j) -> i + j));
  }

  private static int calculateTotalCaloriesWithMethodReference() {
    return menu.stream().collect(reducing(0, Dish::getCalories, Integer::sum));
  }

  private static int calculateTotalCaloriesWithoutCollectors() {
    return menu.stream().map(Dish::getCalories).reduce(Integer::sum).get();
  }

このcollectの中に記述する場合は、***ingという動名詞になるようだ。

Reducerを使わないでもスッキリ書ける。

  private static int calculateTotalCaloriesUsingSum() {
    return menu.stream().mapToInt(Dish::getCalories).sum();
  }

SteamからCalorieの値を取り出してそれををInt側のStreamに変換して、合計している。実にスマートに書ける。 ただの合計ならこれが一番見やすそうだ。

public class Dish {

  private final String name;
  private final boolean vegetarian;
  private final int calories;
  private final Type type;

  public Dish(String name, boolean vegetarian, int calories, Type type) {
    this.name = name;
    this.vegetarian = vegetarian;
    this.calories = calories;
    this.type = type;
  }

  public String getName() {
    return name;
  }

  public boolean isVegetarian() {
    return vegetarian;
  }

  public int getCalories() {
    return calories;
  }

  public Type getType() {
    return type;
  }

  @Override
  public String toString() {
    return name;
  }

  public enum Type {
    MEAT,
    FISH,
    OTHER
  }

  public static final List<Dish> menu = asList(
      new Dish("pork", false, 800, Dish.Type.MEAT),
      new Dish("beef", false, 700, Dish.Type.MEAT),
      new Dish("chicken", false, 400, Dish.Type.MEAT),
      new Dish("french fries", true, 530, Dish.Type.OTHER),
      new Dish("rice", true, 350, Dish.Type.OTHER),
      new Dish("season fruit", true, 120, Dish.Type.OTHER),
      new Dish("pizza", true, 550, Dish.Type.OTHER),
      new Dish("prawns", false, 400, Dish.Type.FISH),
      new Dish("salmon", false, 450, Dish.Type.FISH)
  );