Карта Java Stream для нескольких атрибутов - PullRequest
0 голосов
/ 10 октября 2019

Я использую Optional<ObjectNode> и извлекаю из него различные атрибуты с помощью потоков.

class MyCompany {
    private Age age;
    private Name name;

    // getters and setters

}

        myJSON
                .map(jsonObj -> getAge(jsonObj, "age"))
                .map(age -> new Age(age))
                .ifPresent(myCompany::setAge);


        myJSON
                .map(jsonObj -> getName(jsonObj, "name"))
                .map(name -> new Name(name))
                .ifPresent(myCompany::setName);

public Integer getAge(ObjectNode jsonObj, String toGet) {
    Integer value = null;

    if (jsonObj(toGet)) {

        value = jsonObj(toGet).intValue();

    }

    return value;
}

Теперь я хочу изменить MyCompany, чтобы вместо него включить новый класс Person и Person должны включать имя и возрастные атрибуты. Как я могу использовать поток Java в одном выражении, чтобы сформулировать Person из имени и возраста, а затем установить его в MyCompany

class Person {
    private Age age;
    private Name name;
    // getters and setters


    public void Person(Age age, Name name) {
       this.name = name;
       this.age = age;

    }
}

class MyCompany {
    private Person person;
    //getters and setters for Person
}

1 Ответ

0 голосов
/ 10 октября 2019

Больше нет информации о Optional<ObjectNode> в вашем фрагменте кода, попробуйте следующий код.

@Test
public void test2() {

    //MyCompany JSON String
    String myCompany = "{\"age\":20,\"name\":\"Tom\"}";
    JSONObject jsonObject = JSONObject.parseObject(myCompany);

    //convert to Company with Person
    Optional<Company> tom = Stream.of(jsonObject).map(m -> new Person(m.getInteger("age"), m.getString("name")))
            .map(p -> new Company(p)).findFirst();
    if (tom.isPresent()) {
        System.out.println(tom.get());
        //output in console
        //Tests.Company(person=Tests.Person(age=20, name=Tom))
    }
}

@Data
@AllArgsConstructor
static class Person {
    private int age;
    private String name;
}

@Data
@AllArgsConstructor
static class Company {
    private Person person;
}

@Data
@AllArgsConstructor
static class MyCompany {
    private int age;
    private String name;
}
...