LoginSignup
2
2

More than 3 years have passed since last update.

Java Lambda の入出力型を試してみた〜Map 編〜

Last updated at Posted at 2020-10-02

Java Lambda の入出力の型には、いろんなパターンが使えます。

  • Map 方式
  • POJO 方式
  • InputStream/OutputStream 方式

公式ドキュメントでは ここ に書かれています。

まずは、Map 方式から。

Lambda 関数に渡す入力 JSON はこれです。

{
    "name": "orange juice",
    "price": 1000,
    "releaseDate": 1601606387939,
    "rate": 4.5,
    "rawMaterial": ["orange", "fragrance"],
    "size": {
        "height": 10,
        "width": 20,
        "depth": 30
    }
}

以下のコードでは、この入力 JSON を Map として扱い、標準出力に書きつつ、同じく Map を使って別の JSON を出力しています。

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MapFunction implements RequestHandler<Map<String, Object>, Map<String, Object>> {
    @Override
    public Map<String, Object> handleRequest(Map<String, Object> event, Context context) {
        String name = (String) event.get("name");
        System.out.println(name); // orange juice

        Integer price = (Integer) event.get("price");
        System.out.println(price); // 1000

        Long releaseDate = (Long) event.get("releaseDate");
        System.out.println(releaseDate); // 1601606387939

        Double rate = (Double) event.get("rate");
        System.out.println(rate); // 4.5

        List<String> rawMaterial = (List<String>) event.get("rawMaterial");
        System.out.println(rawMaterial); // [orange, fragrance]

        Map<String, Integer> size = (Map<String, Integer>) event.get("size");
        Integer height = size.get("height");
        System.out.println(height); // 10

        Integer width = size.get("width");
        System.out.println(width); // 20

        Integer depth = size.get("depth");
        System.out.println(depth); // 30

        Map<String, Object> response = new HashMap<>();
        response.put("name", "coffee");
        response.put("price", Integer.valueOf(500));
        response.put("releaseDate", System.currentTimeMillis());
        response.put("rate", Double.valueOf(4.2));
        response.put("rawMaterial", Arrays.asList("coffee", "sugar"));

        Map<String, Integer> responseSize = new HashMap<>();
        responseSize.put("height", Integer.valueOf(100));
        responseSize.put("width", Integer.valueOf(200));
        responseSize.put("depth", Integer.valueOf(300));
        response.put("size", responseSize);

        return response;
    }
}

各値は、JSON の型に沿って String、Integer、Long、Double に変換されてます。配列は List に、連想配列は Map に変換されます。

この Lambda 関数を実行すると、こんな JSON が出力されます。

{
  "size": {
    "depth": 300,
    "width": 200,
    "height": 100
  },
  "releaseDate": 1601615397265,
  "rate": 4.2,
  "price": 500,
  "rawMaterial": [
    "coffee",
    "sugar"
  ],
  "name": "coffee"
}

HashMap を使ってるので、順序はバラバラになります。HashMap ではなくて、たとえば TreeMap を使えば順序が維持されます。
ただ、この JSON を受け取る側が、順序に依存せずに解釈できる実装にする方が望ましいです。

このように、Java Lambda では、Map 型を使うことで JSON を扱うことができます。クラスを増やすことなくコードを書けるものの、キャストの嵐になってしまい、型セーフではなくなってしまいます。次の記事では、この問題を解決できる POJO 方式を紹介します。

Java Lambda の入出力型を試してみた〜POJO 編〜
https://qiita.com/kazfuku/items/095b4fb9c37638f57457

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2