LoginSignup
0
1

More than 3 years have passed since last update.

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

Posted at

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

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

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

POJO 編 では、POJO クラスを使用して JSON を扱う方法を紹介しました。

最後に、InputStream/OutputStream を使った Stream 編です。

前回の POJO 編に手を加えて、Jackson を使って自前で Parse、Generate するコードになります。

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.List;

public class StreamFunction implements RequestStreamHandler {

    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    @Override
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
        Product product = OBJECT_MAPPER.readValue(inputStream, Product.class);

        String name = product.getName();
        System.out.println(name); // orange juice

        Integer price = product.getPrice();
        System.out.println(price); // 1000

        Long releaseDate = product.getReleaseDate();
        System.out.println(releaseDate); // 1601606387939

        Double rate = product.getRate();
        System.out.println(rate); // 4.5

        List<String> rawMaterial = product.getRawMaterial();
        System.out.println(rawMaterial); // [orange, fragrance]

        Product.Size size = product.getSize();
        Integer height = size.getHeight();
        System.out.println(height); // 10

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

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

        Product response = new Product();
        response.setName("coffee");
        response.setPrice(Integer.valueOf(500));
        response.setReleaseDate(System.currentTimeMillis());
        response.setRate(Double.valueOf(4.2));
        response.setRawMaterial(Arrays.asList("coffee", "sugar"));

        Product.Size responseSize = new Product.Size();
        responseSize.setHeight(Integer.valueOf(100));
        responseSize.setWidth(Integer.valueOf(200));
        responseSize.setDepth(Integer.valueOf(300));
        response.setSize(responseSize);

        OBJECT_MAPPER.writeValue(outputStream, response);
    }
}

実行すると、POJO 編と同じ結果になります。

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

あんまり使うところはなさそうですが、巨大な JSON を扱うときとか、JSON の Parser/Generator のライブラリを使いたいときとかでしょうか。

結局どれがいいのか

プロダクトコードなら、保守性から、POJO 方式を使うのがおすすめです。
さくっと動かして試したいだけなら、Map 方式が楽でしょう。

0
1
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
0
1