J'ai essayé le type d'entrée / sortie de Java Lambda ~ édition POJO ~

Différents modèles peuvent être utilisés pour les types d'entrée / sortie de Java Lambda.

Dans le document officiel, il est écrit en ici.

Dans Map, j'ai présenté comment gérer JSON en utilisant le type Map.

Si vous regardez le code de la méthode Map, vous verrez de nombreux casts du type Object au type String / Integer / Long et ainsi de suite.

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
...

Non seulement le code est sale, mais si le type change, il ne sera pas intercepté au moment de la compilation et vous pouvez obtenir une exception ClassCastException au moment de l'exécution.

C'est donc la méthode POJO.

Tout d'abord, créez une classe POJO qui remplace Map. La classe Size est une classe interne, mais il peut s'agir d'une classe normale.

import java.util.List;

public class Product {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private Integer price;

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    private Long releaseDate;

    public Long getReleaseDate() {
        return releaseDate;
    }

    public void setReleaseDate(Long releaseDate) {
        this.releaseDate = releaseDate;
    }

    private Double rate;

    public Double getRate() {
        return rate;
    }

    public void setRate(Double rate) {
        this.rate = rate;
    }

    private List<String> rawMaterial;

    public List<String> getRawMaterial() {
        return rawMaterial;
    }

    public void setRawMaterial(List<String> rawMaterial) {
        this.rawMaterial = rawMaterial;
    }

    private Size size;

    public Size getSize() {
        return size;
    }

    public void setSize(Size size) {
        this.size = size;
    }

    public static class Size {
        private Integer height;

        public Integer getHeight() {
            return height;
        }

        public void setHeight(Integer height) {
            this.height = height;
        }

        private Integer width;

        public Integer getWidth() {
            return width;
        }

        public void setWidth(Integer width) {
            this.width = width;
        }

        private Integer depth;

        public Integer getDepth() {
            return depth;
        }

        public void setDepth(Integer depth) {
            this.depth = depth;
        }
    }
}

Le gestionnaire de la fonction Lambda utilise cette classe comme type d'entrée / sortie.

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

import java.util.Arrays;
import java.util.List;

public class PojoFunction implements RequestHandler<Product, Product> {
    @Override
    public Product handleRequest(Product product, Context context) {
        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);

        return response;
    }
}

Le casting a disparu proprement. Maintenant, même si vous changez le type, vous pouvez obtenir une erreur de compilation.

Si vous faites cela avec le JSON suivant,

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

La sortie sera comme ça.

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

La méthode POJO semble maintenir l'ordre, contrairement à la méthode Map HashMap.

Bibliothèque pratique

Le responsable AWS fournit une bibliothèque pratique, aws-lambda-java-libs, qui tire parti de la possibilité de mapper JSON aux classes POJO. https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-events

Par exemple, dans le cas de l'intégration de proxy Lambda d'API Gateway, vous pouvez utiliser la classe POJO fournie comme ceci pour l'entrée et la sortie.

public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent event, Context context) {
    APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();
    response.setStatusCode(Integer.valueOf(200));
    response.setBody("ok");
    return response;
}

à la fin

Ensuite, je voudrais vous présenter la méthode InputStream / OutputStream.

J'ai essayé le type d'entrée / sortie de Java Lambda ~ Stream version ~ https://qiita.com/kazfuku/items/6f0f55ffa3a88d76cfaa

Recommended Posts

J'ai essayé le type d'entrée / sortie de Java Lambda ~ édition POJO ~
J'ai essayé le type d'entrée / sortie de Java Lambda ~ Map edition ~
J'ai essayé le type d'entrée / sortie de Java Lambda ~ Stream version ~
J'ai essayé de résumer les expressions Java lambda
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
récapitulatif des entrées / sorties standard de vérification des compétences paiza [édition Java]
J'ai essayé Drools (Java, InputStream)
J'ai essayé d'utiliser Java REPL
J'ai essayé la métaprogrammation avec Java
Enfant orienté objet!? J'ai essayé le Deep Learning avec Java (édition d'essai)
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
[Java] Je souhaite tester l'entrée standard et la sortie standard avec JUnit
J'ai essayé d'interagir avec Java
J'ai essayé la communication UDP avec Java
J'ai essayé le framework Java "Quarkus"
J'ai essayé d'utiliser l'API Java8 Stream
J'ai essayé d'utiliser JWT en Java
J'ai essayé de résumer l'apprentissage Java (1)
J'ai essayé de résumer Java 8 maintenant
J'ai essayé d'utiliser le mémo Java LocalDate
J'ai essayé d'utiliser Google HttpClient de Java
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (édition PowerMockito)
J'ai essayé d'utiliser l'API Elasticsearch en Java
J'ai essayé le mappeur d'objets de Cassandra pour Java
Java9 était inclus, j'ai donc essayé jshell.
J'ai essayé le nouveau yuan à Java
J'ai essayé d'utiliser OpenCV avec Java + Tomcat
J'ai essayé l'examen d'entrée de Google (non officiel) [java]
Je ne me souviens pas de l'entrée / sortie du fichier texte en Java, alors je l'ai résumé.
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (Black Magic)
Écrivons l'entrée / sortie de fichier Java avec NIO
J'ai essayé de mettre facilement Java sur mon Mac
J'ai essayé de faire une authentification de base avec Java
java j'ai essayé de casser un simple bloc
J'ai essayé de frapper une méthode Java d'ABCL
Efficace Java 3e édition Chapitre 7 Lambda et Stream
J'ai essayé de créer une compétence Alexa avec Java
J'ai essayé de casser le bloc avec java (1)
J'ai essayé d'exécuter Java dans un terminal Mac
J'ai essayé d'expliquer Effective Java 3rd Edition "presque tous les chapitres" en "japonais facile à lire".